17

在LLVM 项目的源代码中,它显示: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 行 from #define X X。为什么要这么做?它有什么区别?这不会强制编译器替换,比如说,truetrue

4

3 回答 3

19

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

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

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

#define bool int

这会干扰第一个定义

于 2013-09-01T11:22:44.563 回答
7
#define X X

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

#ifdef X

是“真” “成功”。*


*更新

于 2013-09-01T11:18:06.857 回答
2

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

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

会受到影响。

于 2013-09-01T11:18:47.220 回答