#if 与枚举一起使用

#if usage with enums

我有一个头文件,内容如下:

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

在我的代码中有类似

的东西
#define S_FACTOR AB0

现在,函数调用如

foo(S_FACTOR);

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

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

不能正常工作。

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

#define S_FACTOR AB0

您是在告诉预处理器将标记 S_FACTOR 替换为标记 AB0,仅此而已。

#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 被#defined 为 AB1.

,情况会完全一样

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