#if使用枚举

mik*_*535 1 c enums if-statement c-preprocessor preprocessor-directive

我有一个头文件,如:

enum DataRate {
    AB0,
    AB1,
    AB2,
    ...
};
Run Code Online (Sandbox Code Playgroud)

在我的代码中我有类似的东西

#define S_FACTOR AB0
Run Code Online (Sandbox Code Playgroud)

现在,函数调用就像

foo(S_FACTOR);
Run Code Online (Sandbox Code Playgroud)

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

#if ( (S_FACTOR == AB0) || (S_FACTOR == AB2) )
Run Code Online (Sandbox Code Playgroud)

不能正常工作.

ric*_*ici 5

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

#define S_FACTOR AB0
Run Code Online (Sandbox Code Playgroud)

你告诉预处理器用令牌S_FACTOR替换令牌AB0,没有别的.

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

所以

#if ( (S_FACTOR == AB0) || (S_FACTOR == AB2) )
Run Code Online (Sandbox Code Playgroud)

将首先减少到

#if ( (AB0 == AB0) || (AB0 == AB2) )
Run Code Online (Sandbox Code Playgroud)

因为S_FACTOR是一个带有替换列表的宏.

然后用0替换所有标识符:

#if ( (0 == 0) || (0 == 0) )
Run Code Online (Sandbox Code Playgroud)

这肯定会计算为1(通过布尔值的通常C语义),因此处理的主体#if.但它与S_FACTOR#defined一样完全相同AB1.

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