我遇到了这些问题:
#define bool bool
#define false false
#define true true
我认为我不需要说“wtf?”,但要明确一点:为自己定义一些东西有什么意义?
这些行来自clang stdbool.h
答案 0 :(得分:7)
它允许用户代码根据这些宏是否定义进行有条件的编译:
#if defined(bool)
/*...*/
#else
/*...*/
#endif
它基本上使您不必使用另一个名称(如HAVE_BOOL
)污染全局命名空间,前提是该实现允许其用户知道 iff 它提供{{1它还将提供一个与其扩展的宏名称相同的宏(或者实现可以在内部为其自己的预处理器条件使用它)。
答案 1 :(得分:6)
C和C ++标准明确允许(并要求没有无限扩展)
BTW,类似函数的递归(或self-refential)宏更有用:#define puts(X) (nblines++,puts(X))
(内部puts
是对标准puts
函数的调用;宏"通过计算nblines
来重载"此类进一步调用)
您的定义可能很有用,例如后来的结构如#ifdef true
,它不能是一个简单的 ,因为那样会“擦除”#34;每次进一步使用#define true
true
时,都必须正好#define true true
。
答案 2 :(得分:4)
它被称为自引用宏。
根据gcv参考:
自引用宏是其名称出现在其定义中的宏。 回想一下,重新扫描所有宏定义以获得更多宏 更换。如果自引用被认为是宏的使用,那么 会产生无限大的扩张。为了防止这种情况, 自引用不被视为宏调用。它传入了 预处理器输出不变。
参考例:
自引用的一个常见且有用的用途是创建一个扩展到自身的宏。如果你写
#define EPERM EPERM
然后宏EPERM扩展到EPERM。实际上,它是孤立的 由预处理器在运行文本时使用。你可以说 它是'#ifdef'的宏。如果你愿意,你可以这样做 使用枚举定义数字常量,但是'#ifdef'为真 每个常数。