在被编译器错误指向之后,我注意到clang的stdbool.h文件包括(除其他外)以下几行:
#define bool bool
#define false false
#define true true它们包含在一个间接强制执行#ifdef的__cplusplus块中,因此,即使stdbool.h是一个C头,c++标记也是如此。
这些定义的需要是什么?我想它们是因为一些与预处理相关的原因而需要的,但是我想知道标准的哪一部分,或者是什么技术原因,所以必须包括这些。
发布于 2015-06-16 18:38:22
stdbool.h是C头,而不是C++头。它通常不存在于C++程序中,因为true和false已经是C++中的关键字。
因此,如果一个C++程序包括stdbool.h,它就相当清楚地表明它是一个可移植的C程序(例如,正在编译为C++的C程序)。在本例中,根据来自G++的注释,stdbool.h在C++模式下支持作为stdbool.h扩展。
/* Supporting <stdbool.h> in C++ is a GCC extension. */
#define _Bool bool
#define bool bool
#define false false
#define true true
...
/* Signal that all the definitions are present. */
#define __bool_true_false_are_defined 1同样,Clang支持stdbool.h在C++中与G++兼容。这里有意定义这些值,以匹配内置的C++类型,而不是传统的C99定义。它们被定义为宏,可能是为了提供与C99 standard的某种兼容性,这需要:
标头将定义以下宏:
bool、true、false、__bool_true_false_are_defined。 应用程序可能取消定义,然后可能重新定义宏bool、true和false。
发布于 2015-06-16 18:37:45
它是添加到suport GNU mode in C++中的,我们从这个修补程序[cfe-commits] r115028 中可以看到。
当我们使用与GNU兼容的_Bool方言时,定义C++、bool、true和false宏。修正了rdar://problem/8477819。
因此,gcc将其作为扩展来支持,并对其进行了修改以支持该扩展。
虽然我找不到补丁中提到的原始问题报告。
正如我们从C++11标准草案18.10其他运行时支持support.runtime中可以看到的那样,这是不符合的。
标头和头不应定义名为bool、true或false的宏。
但是,gcc并不意味着严格遵循GNU模式。
stdbool.h是C99的一部分,因此直到附件D中所说的C++11才支持C++标准:
为了与C标准库和C Unicode TR兼容,C++标准库提供了25个C头,如表154所示
并包括<stdbool.h>。
https://stackoverflow.com/questions/30875069
复制相似问题