#if 条件编译还是用得少啊,最近编写测试代码发现一个以前不知道的问题。
代码1:
enum {
TEST_A = 0,
TEST_B = 1,
TEST_C = 2,
};
#define TEST TEST_B
int main()
{
#if (TEST == TEST_A)
printf("test A\r\n");
#elif (TEST == TEST_B)
printf("test B\r\n");
#elif (TEST == TEST_C)
printf("test C\r\n");
#endif
return 0;
}
代码1无论TEST宏的值是TESTA、B、C打印的都是test A
代码2:
#define TEST_A 0
#define TEST_B 1
#define TEST_C 2
#define TEST TEST_B
int main()
{
#if (TEST == TEST_A)
printf("test A\r\n");
#elif (TEST == TEST_B)
printf("test B\r\n");
#elif (TEST == TEST_C)
printf("test C\r\n");
#endif
return 0;
}
代码段2中将TESTA、B、C改成宏就没有问题
原因:这是因为枚举成员的值是在编译阶段确定的,而宏展开替换是在预编译阶段进行的。因为预编译阶段是先于编译阶段的,如把枚举成员置于宏,此时枚举变量值被认为是0。