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

klu*_*utt 2 c self-reference c-preprocessor

我遇到了这些问题:

#define bool  bool
#define false false
#define true  true
Run Code Online (Sandbox Code Playgroud)

我不认为我需要说的不仅仅是"wtf?",而是要明确:为自己定义一些东西有什么意义?

这些行来自clang stdbool.h

PSk*_*cik 7

它允许用户代码根据是否定义了这些宏来有条件地编译:

#if defined(bool)
    /*...*/
#else
    /*...*/
#endif
Run Code Online (Sandbox Code Playgroud)

它基本上使您不必使用另一个名称(例如HAVE_BOOL)污染全局命名空间,前提是该实现允许其用户知道如果它提供了一个bool,它还将提供一个具有相同名称的宏扩展到它(或者实现可以简单地在内部使用它来实现它自己的预处理器条件.


Bas*_*tch 6

C和C++标准明确允许(并要求没有无限扩展)

BTW,类似函数的递归(或自我反射)宏更有用:

#define puts(X) (nblines++,puts(X))
Run Code Online (Sandbox Code Playgroud)

(内部puts 是对标准puts函数的调用;宏通过计数"重载"这样的进一步调用nblines)

你的定义可能很有用,例如后面的​​结构就像#ifdef true,并且它不能简单,#define true因为它会"擦除"每次进一步使用true,所以它必须是精确的#define true true.

  • 除此之外,它不会干扰代码中使用令牌的其他方式.如果它刚刚执行了`#define true`以允许`#ifdef为true',那么你就不能使用`true`作为变量的名称. (3认同)