在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行中,有来自#define X X
的三行。为什么要这么做?它有什么不同?这个强制编译器不会用true
代替true
吗?
答案 0 :(得分:19)
我能想到的唯一原因是,预处理器语句如
#ifdef bool
// do some stuff or define bool
#endif
在其他c文件中包括之后将正常工作而不是试图以另一种方式重新定义bool,如
#define bool int
会干扰第一个定义
答案 1 :(得分:8)
#define X X
具有“预处理器条件” * :
的效果#ifdef X
是“true”“成功”。 *
* 更新
答案 2 :(得分:2)
真正的,错误的等等现在是宏。所以像这样的代码
#if defined(true)
...
#else
...
#endif
会受到影响。