为什么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++ 程序中,因为 true
和 false
已经是 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.
在被编译器错误指出后,我注意到 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++ 程序中,因为 true
和 false
已经是 C++ 中的关键字。
因此,如果 C++ 程序包含 stdbool.h
,则相当清楚地表明它是一个移植的 C 程序(例如,一个被编译为 C++ 的 C 程序)。在这种情况下,根据 GCC stdbool.h
:
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.