#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 处理器是有原因的。它在任何其他处理(包括声明)之前完成工作。
我有一个头文件,内容如下:
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 处理器是有原因的。它在任何其他处理(包括声明)之前完成工作。