【问题标题】:C Preprocessor and enums – mistake in my code?C 预处理器和枚举——我的代码中的错误?
【发布时间】:2012-12-16 23:26:12
【问题描述】:

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

enum {
    MyStyleA,
    MyStyleB,
    MyStyleC
};

#define STYLE MyStyleB

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

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

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

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

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

【问题讨论】:

标签: c enums c-preprocessor


【解决方案1】:

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

预处理器不知道 MyStyleC 是什么 - 在它到达编译器之前它不会得到值。

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

【讨论】:

  • 刚刚尝试过:预处理器指令消失了,对doSomething() 的调用仍然存在。 :-)
  • cc -E foo.c 通常将预处理器输出发送到终端。
【解决方案2】:

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

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

改为?

【讨论】:

  • 好吧,如果我想在编译时做出这个决定怎么办?为什么我没有收到警告/错误?预处理器认为MyStyleC 的结果是什么?
  • @tajmahal “如果我想在编译时做出这个决定怎么办?” - 那么您迫切需要重新设计您的代码。 “预处理器认为 MyStyleC 的评估结果是什么?” - 这很奇怪,因为它不知道它正在处理的令牌,我也期待一个错误,但问题是,你不应该(ab)像这样使用预处理器。与其考虑这个毫无意义的错误,不如尝试重新组织你的代码逻辑,这样你就不需要这个丑陋的 hack。
  • 好吧,我想我可以用简单的#defines 替换枚举以使其工作......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
相关资源
最近更新 更多