#define X X在C中有什么影响?

时间:2013-09-01 11:12:23

标签: c++ c llvm llvm-clang

在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吗?

3 个答案:

答案 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

会受到影响。