2

我在全局标头中有以下代码,因此我可以在编译时做出决定:

enum {
    MyStyleA,
    MyStyleB,
    MyStyleC
};

#define STYLE MyStyleB

在各种源文件中,我包含此标头并执行以下操作:

#if STYLE == MyStyleC
    doSomething();
#endif

问题是,doSomething()即使我在标题中定义STYLE,也肯定会执行!MyStyleB

知道这里出了什么问题吗?

(我承认我不是C预处理器专家。)

4

2 回答 2

2

我的床头柜上没有 C 标准的副本,所以我可能是错的,但是:

预处理器不知道是什么MyStyleC——直到它到达编译器才得到一个值。

编译器通常有一个选项(以前是 -e ?)来输出预处理器阶段的结果(作为文本) - 我会看看它,看看#if预处理器完成它后你的样子。

于 2012-12-16T23:31:17.063 回答
1

预处理器不了解代码的语义,它只进行文字宏替换,因此它只能使用常量表达式。怎么写

if (STYLE == MyStyleC) {
    doSomething();
}

反而?

于 2012-12-16T23:29:26.917 回答