我正在使用支持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
。但是,为什么它最常用?为什么在编译它不起作用的模块时,我没有得到任何警告或错误?
答案 0 :(得分:5)
#define hehe true
#if hehe
#error hehe
#else
#error haha
#endif
将#error haha
,因为hehe
扩展为true
而true
将被0
替换,因为
§6.10.1¶4所有剩余的标识符(包括那些词汇 与关键字相同)被替换为pp-number 0
但是,如果您在#include <stdbool.h>
之前发生#if
,则会#error hehe
,因为
§7.18标题定义了四个宏。 ...
¶3其余三个宏适合在#if预处理中使用 指令。它们是
true
,它扩展为整数常量 1 ...