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

Why does clang's stdbool.h contain #define false false

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

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

它们包含在间接强制执行 __cplusplus#ifdef 块中,因此即使 stdbool.h 是 C header.[=17= 也有 c++ 标记]

这些定义需要什么?我想它们是出于某些 preprocessor-related 原因所必需的,但我很想知道标准的哪一部分或技术原因使得 clang 必须包括这些。

已添加支持 GNU mode in C++, as we can see from this patch [cfe-commits] r115028 :

Define _Bool, bool, true, and false macros in when we're in a GNU-compatible C++ dialect. Fixes <rdar://problem/8477819>.

所以 gcc 支持将此作为扩展,并且进行此修改以支持该扩展。

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

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

The header <cstdbool> and the header <stdbool.h> shall not define macros named bool, true, or false.

gcc 并不意味着严格符合 GNU 模式。

stdbool.h 是 C99 的一部分,因此直到 C++11 才被 C++ 标准支持,在 Annex D 中说:

For compatibility with the C standard library and the C Unicode TR, the C++ standard library provides the 25 C headers, as shown in Table 154

并包括 <stdbool.h>

stdbool.h 是 C 头文件,而不是 C++ 头文件。它通常不会出现在 C++ 程序中,因为 truefalse 已经是 C++ 中的关键字。

因此,如果 C++ 程序包含 stdbool.h,则相当清楚地表明它是一个移植的 C 程序(例如,一个被编译为 C++ 的 C 程序)。在这种情况下,根据 GCC stdbool.h:

的评论,G++ 在 C++ 模式下支持 stdbool.h 作为 GNU 扩展
/* 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++ 类型而不是传统的 C99 定义。它们被定义为宏,大概是为了提供与 C99 standard 的一些兼容性,这需要:

The header shall define the following macros: bool, true, false, __bool_true_false_are_defined.

An application may undefine and then possibly redefine the macros bool, true, and false.