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)
不能正常工作.
预处理器对枚举一无所知; 它只是文本的操纵者.当你提供
#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.
预处理器被称为预处理器是有原因的.它在任何其他处理之前完成其工作,包括声明.