我在全局标头中有以下代码,因此我可以在编译时做出决定:
enum {
MyStyleA,
MyStyleB,
MyStyleC
};
#define STYLE MyStyleB
在各种源文件中,我包含此标题并执行以下操作:
#if STYLE == MyStyleC
doSomething();
#endif
问题是,即使我在标题中将doSomething()
定义为STYLE
,MyStyleB
肯定会被执行!
知道这里出了什么问题吗?
(我承认我不是 C 预处理专家。)
答案 0 :(得分:2)
我的床头柜上没有C标准的副本,所以我错了,但是:
预处理器不知道MyStyleC
是什么 - 在它到达编译器之前没有得到值。
编译器通常有一个选项(以前是-e?)来输出预处理器阶段的结果(作为文本) - 我会看一下,看看预处理器之后你的#if
是什么样的过去了。
答案 1 :(得分:1)
预处理器不了解代码的语义,它只进行文字宏替换,因此它只能用于常量表达式。写作怎么样
if (STYLE == MyStyleC) {
doSomething();
}
代替?