【问题标题】:What effect does #define X X have in C?#define X X 在 C 中有什么作用?
【发布时间】:2013-09-01 11:12:23
【问题描述】:

在 LLVM 项目的source code of stdbool.h 中,内容如下:

/* Don't define bool, true, and false in C++, except as a GNU extension. */
#ifndef __cplusplus
#define bool _Bool
#define true 1
#define false 0
#elif defined(__GNUC__) && !defined(__STRICT_ANSI__)
/* Define _Bool, bool, false, true as a GNU extension. */
#define _Bool bool
#define bool  bool
#define false false
#define true  true
#endif

在最后 4 行中,有 3 行来自 #define X X。为什么要这么做?它有什么区别?这不会强制编译器将true 替换为true 吗?

【问题讨论】:

    标签: c++ c llvm llvm-clang


    【解决方案1】:

    我能想到的唯一原因是,像这样的预处理器语句

    #ifdef bool
    // do some stuff or define bool
    #endif
    

    在其他 c 文件中包含之后将正常工作,而不是尝试以另一种方式重新定义 bool,例如

    #define bool int
    

    这会干扰第一个定义

    【讨论】:

      【解决方案2】:
      #define X X
      

      具有“预处理器条件”的效果*

      #ifdef X
      

      是“真”“成功”。*


      * 更新

      【讨论】:

      • 不是我,但我猜说预处理器指令是“真的”让你投了反对票。有些人非常注重准确性。
      • @john:我知道这一点,所以我把它放在引号里。然而,它是预处理上下文中的布尔表达式,不是吗?你有替代措辞的想法吗?
      • 好的,我认为编辑应该以准确的措辞满足任何人的期望。
      • 为什么会有人选择它而不是#define X
      • @vsz 在这种情况下,它将重新定义 C++ 的 bool 关键字以扩展为空。
      【解决方案3】:

      true、false 等现在是宏会有所不同。所以像这样的代码

      #if defined(true)
          ...
      #else
          ...
      #endif
      

      会受到影响。

      【讨论】:

      • 你的意思是#ifdef true
      • @MilesRout #ifdef true#if defined(true) 是一样的。
      • 好吧,这就是我的观点,但我的意思是我写的。
      • @MilesRout 更短,是的。更清楚,不一定。 #ifdef 不太通用。 defined X 可以与其他表达式组合。而且我个人认为#if !defined X#ifndef更不容易被误读。
      • @MilesRout #if defined#ifdef 的优势在于它允许您添加#elif 案例
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 2022-11-24
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多