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) )