在C99中的宏中使用true和false

时间:2016-08-09 09:44:59

标签: c boolean c-preprocessor c99 preprocessor-directive

我正在使用支持C99子集的自定义gcc编译器编写一些代码。使用编译器选项我定义了一个像这样的宏:

ENABLE_LOGGING=true

我在我的代码中使用它:

#if ENABLE_LOGGING
#define LOG(foo) { log(foo); }
#else
#define LOG(foo)
#endif

事实证明这不能可靠地运作。有时使用包含LOG的代码,有时使用emtpy LOG(相同的项目,相同的编译器设置)。

将宏参数更改为:

ENABLE_LOGGING=1
一切正常。

我知道预处理器可能不知道true。但是,为什么它最常用?为什么在编译它不起作用的模块时,我没有得到任何警告或错误?

1 个答案:

答案 0 :(得分:5)

#define hehe true
#if hehe
#error hehe
#else
#error haha
#endif

#error haha,因为hehe扩展为truetrue将被0替换,因为

  

§6.10.1¶4所有剩余的标识符(包括那些词汇       与关键字相同)被替换为pp-number 0

但是,如果您在#include <stdbool.h>之前发生#if,则会#error hehe,因为

  

§7.18标题定义了四个宏。 ...

     

¶3其余三个宏适合在#if预处理中使用   指令。它们是true,它扩展为整数常量    1 ...