在C预处理器中为自己定义一些东西

时间:2017-10-17 19:29:24

标签: c c-preprocessor self-reference

我遇到了这些问题:

#define bool  bool
#define false false
#define true  true

我认为我不需要说“wtf?”,但要明确一点:为自己定义一些东西有什么意义?

这些行来自clang stdbool.h

3 个答案:

答案 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,它不能是一个简单的 #define true ,因为那样会“擦除”#34;每次进一步使用true时,都必须正好#define true true

答案 2 :(得分:4)

它被称为自引用宏。

根据gcv参考:

  

自引用宏是其名称出现在其定义中的宏。   回想一下,重新扫描所有宏定义以获得更多宏   更换。如果自引用被认为是宏的使用,那么   会产生无限大的扩张。为了防止这种情况,   自引用不被视为宏调用。它传入了   预处理器输出不变。

参考例:

  

自引用的一个常见且有用的用途是创建一个扩展到自身的宏。如果你写

     

#define EPERM EPERM

     

然后宏EPERM扩展到EPERM。实际上,它是孤立的   由预处理器在运行文本时使用。你可以说   它是'#ifdef'的宏。如果你愿意,你可以这样做   使用枚举定义数字常量,但是'#ifdef'为真   每个常数。