bool数据类型是否可以在c ++中移植?

时间:2018-06-05 05:20:13

标签: c++

可以在C ++中使用bool数据类型,并且仍然可以确保可移植性吗?

在其他帖子中有部分讨论,但没有具体讨论可移植性。

我想知道我是否可以使用bool并确保它可以在大多数系统(例如99%)中编译,如果不是所有系统的话。

4 个答案:

答案 0 :(得分:8)

<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> <key>NSExceptionDomains</key> <dict> <key>localhost</key> <dict> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict> 是内置类型,因此与C ++语言本身一样可移植

答案 1 :(得分:5)

bool是自第一个C ++标准(C ++ 98)以来的内置类型,所以如果你有一个符合任何 C ++标准的编译器(可以说,任何编译器来自过去20年你应该被设定。

对于预标准的C ++,环顾四周似乎,在PC编译器上,它出现在1996-1997左右(Visual C ++ 5,Borland C ++ 5);实际上,GotW #26提到bool是“自[Stroutroup的]注释C ++参考手册”(1990)以来唯一要添加到C ++的内置数据类型,所以推断它诞生于1990年之间是合理的。在网上阅读1993经常作为bool在C ++中的“出生日期”被抛出,但我找不到一个可靠的参考资料。

虽然您仍然可以找到过时的页面(主要来自大学课程)来解释如何解决旧编译器中bool的缺失问题,但现在使用它没有兼容性问题,除非您被迫使用非常古老的工具链(我在看你,2018年推荐Turbo C ++的大学课程)。

也许你对C感到困惑,bool只出现在C99?

  

预标准C ++(如Cfront)中bool是否可用?

the sources of Cfront 3.0.3(1994年,虽然最初的3.0是在1991年发布的),bool确实被抛出了很多,特别是在标准的标题中,例如basic_string.h

至于它的定义,有typedef char bool;的疯狂组合(但在#ifdef CFRONT_COMPATIBLE_LUCENT内,所以也许它只是兼容性定义?WTF,版权日期是1996年?),{{ 3}},#define bool char,以及有希望命名的std_bool.h标题中的enum bool { false, true };(但也有1996年的版权日期!)。

查看词法分析器和解析器我找不到bool的提及,虽然typedef int bool;引用它作为基本类型,所以有一些证据表明有人认为它是(或者是将是一个内置的。

尽管如此,虽然它的精确定义有点模糊,但如上所述某些名为bool的{​​{1}}和true确实可以在标准库中使用和使用,因此,如果您计划使用Cfront 3.0编译代码,false可能是您最不关心的问题。 : - )

顺便说一句,这次古老的C ++之旅带来了一些悲伤:Cfront 3.0 the demangler,我们不得不等待C ++ 11再次回来(而且还有一段时间内仍然存在段错误更多年来在libstdc ++)。

答案 2 :(得分:1)

请注意,如果您担心存储可移植性(序列化),那么bool不是一种特别便携的类型,大小没有限制(事实上,它几乎没有&#39; char&#39;)。

尽管bool已经在c ++中,只要该语言已经标准化。

答案 3 :(得分:-4)

C++并不意味着什么(它更像是一系列相关语言,而不是单一语言)。您需要定位特定的 C ++标准。至少考虑一下C ++ 11(但不要考虑旧版标准,也可能提到bool),如果可能的话还要考虑C ++ 14。

然后bool是C ++ 11(以及后来的标准,如C ++ 14或C ++ 17)的一部分。通过阅读n3337进行检查。它也是C ++ 98的一部分,但你不应该在乎。

(请注意,自从包含C ++ 11以来,C ++发生了很大的变化,这就是为什么我不建议使用像C ++ 98这样的旧标准;只有在引用特定标准时,可移植性才有意义;它通常不会有意义地编写可移植到所有C ++ 98,C ++ 11,C ++ 17,C ++ 20)的代码

如果你想编写一个过时的标准,如C ++ 98,可以使用后来的符合标准的编译器(例如某些兼容C ++ 17的编译器)进行编译,你应该问一个不同的问题。 bool不是问题,但你有很多其他(更重要的)问题。

大多数平台支持的C ++标准是一个非常不同的问题。如果您能够负担得起最近的编译器(例如,如果您可以安装最新版本的GCCClang),我会打赌C ++ 11。

你肯定能够在一些博物馆中找到一台过时的计算机,它有一个C ++ 98编译器而不是一个C ++ 11编译器。你甚至可以找到没有C ++编译器的计算机(甚至没有任何编译器)。

当然,1987年在博物馆中陈旧的Sun3 / 60接受C ++方言(可能有些Cfront)与我的Linux桌面上GCC 8接受的几个dialects of C++非常不同。

您要编写的代码是标准(例如C ++ 11,与C ++ 98,C ++ 14,C ++ 17一样,也提及{{1} })。 这确保了相同标准的其他实现的可移植性。当然C ++ 98,C ++ 11,C ++ 14,C ++ 17都提到了bool;但是如果你想针对几个 C ++标准进行编码(这可能很困难),你需要非常小心(可能需要使用一些预处理器条件来为不同的C ++标准提供不同的代码)。