首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么clang的stdbool.h包含#定义假假

为什么clang的stdbool.h包含#定义假假
EN

Stack Overflow用户
提问于 2015-06-16 18:11:22
回答 2查看 4.4K关注 0票数 63

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

代码语言:javascript
复制
#define bool  bool
#define false false
#define true  true

它们包含在一个间接强制执行#ifdef__cplusplus块中,因此,即使stdbool.h是一个C头,c++标记也是如此。

这些定义的需要是什么?我想它们是因为一些与预处理相关的原因而需要的,但是我想知道标准的哪一部分,或者是什么技术原因,所以必须包括这些。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-16 18:38:22

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

因此,如果一个C++程序包括stdbool.h,它就相当清楚地表明它是一个可移植的C程序(例如,正在编译为C++的C程序)。在本例中,根据来自G++的注释,stdbool.h在C++模式下支持作为stdbool.h扩展。

代码语言:javascript
复制
/* 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的某种兼容性,这需要:

标头将定义以下宏:booltruefalse__bool_true_false_are_defined。 应用程序可能取消定义,然后可能重新定义宏bool、true和false。

票数 51
EN

Stack Overflow用户

发布于 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>

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30875069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档