为什么clang的stdbool.h包含#define false false

在被编译器错误指向之后,我注意到了clang的stdbool.h文件包含(除其他外)以下几行:

 #define bool bool #define false false #define true true 

它们包含在一个#ifdef块中,间接强制__cplusplus ,因此即使stdbool.h是C头,也是c ++标签。

这些定义需要什么? 我想他们是需要一些预处理器相关的原因,但我有兴趣知道标准的哪个部分或哪个技术原因使得它铿锵必须包括这些。

stdbool.h是一个C头,而不是一个C ++头。 它通常不在C ++程序中find,因为truefalse已经是C ++中的关键字。

因此,如果一个C ++程序包含stdbool.h那么这是一个相当清楚的指示,即它是一个移植过的C程序(例如,正在编译为C ++的C程序)。 在这种情况下,G ++按照GCC stdbool.h的注释,以C ++模式作为GNU扩展支持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支持C ++中的stdbool.h以兼容G ++。 这里的值是有意定义的,以匹配内置的C ++types,而不是传统的C99定义。 它们被定义为可以提供与C99标准兼容的macros,这需要:

头文件应定义下列macrosbooltruefalse__bool_true_false_are_defined

应用程序可能取消定义,然后可能重新定义macros布尔,真,假。

它被添加到支持C ++的GNU模式 ,我们可以从这个补丁中看到[cfe-commits] r115028 :

当我们使用GNU兼容的C ++方言时,定义_Bool,bool,true和falsemacros。 修复<rdar:// problem / 8477819>。

所以gcc支持这个作为扩展,这个修改是为了支持这个扩展。

虽然我找不到补丁中提到的原始问题报告。

这是不符合的,正如我们从C ++ 11标准草案部分可以看到的那样18.10其他运行时支持[support.runtime]

头文件<cstdbool>和头文件<stdbool.h>不能定义名为bool,true或者false的macros。

gcc并不意味着严格遵守GNU模式。

stdbool.h是C99的一部分,因此直到附录D中的 C ++ 11才说明:

为了与C标准库和C Unicode TR兼容,C ++标准库提供了25 C头文件,如表154所示

并包含<stdbool.h>