【问题标题】:Why does clang's stdbool.h contain #define false false为什么 clang 的 stdbool.h 包含 #define false false
【发布时间】:2015-09-01 17:07:40
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这很可能是为了安抚那些期望 falsetrue 是宏的移植 C 程序(例如,使用 #ifndef false 测试)。
  • 这里有一个相关的问题,并不是说答案一定完全一样,有些优点是一样的:stackoverflow.com/questions/21855326/utility-of-macros-for-enum
  • 一方面,如果有人再次尝试#define他们,它会导致警告。
  • 您应该阅读有关 GNU 扩展的 cmets。
  • 什么编译器错误指向你?如果它是“false 的重新定义”或其他东西......那么按预期工作:)

标签: c++ clang language-lawyer


【解决方案1】:

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

因此,如果 C++ 程序包含 stdbool.h,则相当清楚地表明它是移植的 C 程序(例如,正在编译为 C++ 的 C 程序)。在这种情况下,G++ 支持 C++ 模式下的 stdbool.h 作为 GNU 扩展,根据来自 GCC stdbool.h 的 cmets:

/* 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 的一些兼容性,这需要:

标头应定义以下booltruefalse__bool_true_false_are_defined

应用程序可以取消定义,然后可能重新定义宏 bool、true 和 false。

【讨论】:

    【解决方案2】:

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

    定义 _Bool、bool、true 和 false 宏 使用 GNU 兼容的 C++ 方言。修复

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

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

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

    头文件 和头文件 不得 定义名为 bool、true 或 false 的宏。

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

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

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

    包括&lt;stdbool.h&gt;

    【讨论】:

      猜你喜欢
      • 2020-10-12
      • 2016-12-13
      • 2017-07-26
      • 2015-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      相关资源
      最近更新 更多