C #如果使用枚举

C #如果使用枚举,c,if-statement,enums,c-preprocessor,preprocessor-directive,C,If Statement,Enums,C Preprocessor,Preprocessor Directive,我有一个头文件,其中包含如下内容: enum DataRate { AB0, AB1, AB2, ... }; 在我的代码中我有这样的东西 #define S_FACTOR AB0 现在,函数调用 foo(S_FACTOR); 似乎工作正常,但条件编译 #if ( (S_FACTOR == AB0) || (S_FACTOR == AB2) ) 无法正常工作。预处理器对枚举一无所知;它只是一个文本操纵器。当你提供 #define S_FACTOR AB0

我有一个头文件,其中包含如下内容:

enum DataRate {
    AB0,
    AB1,
    AB2,
    ...
};
在我的代码中我有这样的东西

#define S_FACTOR AB0
现在,函数调用

foo(S_FACTOR);
似乎工作正常,但条件编译

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

无法正常工作。

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

#define S_FACTOR AB0
您正在告诉预处理器用令牌
AB0
替换令牌
S_因子
,而不是其他

#if
预处理器指令有点奇怪。它仍然只做文本替换,目的是将其参数简化为包含整数常量的算术表达式。因此,它首先替换表达式中所有已定义的宏。然后,它用0替换任何剩余的标识符标记,并尝试对表达式求值

所以

将首先减少到

#if ( (AB0 == AB0) || (AB0 == AB2) )
因为
S_FACTOR
是一个带有替换列表的宏

然后将所有标识符替换为0:

#if ( (0 == 0) || (0 == 0) )
它的计算结果当然是1(根据布尔值通常的C语义),因此
#if
的主体被处理。但如果将
S#u因子
定义为
AB1
,则情况会完全相同


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

好的,我明白了。如果我想使用“#define”来设置条件编译,除了简单的“#define SNA”和“#define FOO”之外,还有其他方案吗?这样以后我就可以对它们执行简单的逻辑了(就像我所做的那样)?嗯。。现在看起来很清楚,我不使用枚举!(我正在使用的枚举是在一个.h文件中提供给我的,所以我必须想出一些办法)。谢谢
#if ( (0 == 0) || (0 == 0) )