可以在C ++中使用bool
数据类型,并且仍然可以确保可移植性吗?
在其他帖子中有部分讨论,但没有具体讨论可移植性。
我想知道我是否可以使用bool
并确保它可以在大多数系统(例如99%)中编译,如果不是所有系统的话。
答案 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 ++标准是一个非常不同的问题。如果您能够负担得起最近的编译器(例如,如果您可以安装最新版本的GCC或Clang),我会打赌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 ++标准提供不同的代码)。