2016-05-17 75 views
1

我有一个头文件的东西,如#如果用法:与枚举

enum DataRate { 
    AB0, 
    AB1, 
    AB2, 
    ... 
}; 

,并在我的代码我有事情喜欢

#define S_FACTOR AB0 

现在,函数调用像

foo(S_FACTOR); 

似乎工作正常,但条件汇编

#if ((S_FACTOR == AB0) || (S_FACTOR == AB2)) 

无法正常工作。

回答

5

预处理器对枚举一无所知;它只是一个文本的操纵者。当您提供

#define S_FACTOR AB0 

你告诉预处理器与令牌AB0替代令牌S_FACTOR,而不是其他。

#if预处理器指令有点奇怪。它仍然只是文本替换,其目的是将其参数减少为涉及整型常量的算术表达式。因此,它首先替换表达式中的所有已定义的宏。然后它将任何剩余的标识符标记替换为0,并尝试评估表达式。

所以

#if ((S_FACTOR == AB0) || (S_FACTOR == AB2)) 

将首先被降低到

#if ((AB0 == AB0) || (AB0 == AB2)) 

因为S_FACTOR是与替换列表宏。

然后,它取代所有识别符与0:

#if ((0 == 0) || (0 == 0)) 

这肯定的计算结果为1(通常的C语义布尔值),因此#if的本体进行处理。但如果S_FACTOR已被定义为AB1,那就完全一样了。

有一个原因是预处理器被称为pre处理器。它在任何其他处理(包括声明)之前完成其工作。

+0

好的,我明白了。如果我想用'#define'来设置条件编译,除了'#define SNA'和'#define FOO'以外,还有其他的方案,以便我可以在后面执行简单的逻辑(就像我已经做的那样)? – mike65535

+0

嗯..现在似乎清楚我不使用枚举! (我使用的枚举是在.h文件中提供给我的,所以我必须提出一些东西)。 **谢谢!** – mike65535