为什么我不能使用 #if 比较宏和枚举?
Why cant I compare macro and enum using #if?
我正在尝试使用 #if 检查宏和枚举是否相等。即使两者具有相同的值,检查也会失败。为什么?
使用 #define NUMBER 2 创建了一个宏。创建了包含一个值为 2 的条目的枚举。使用 #if 比较了两者。与 2 比较的宏正在通过。但将宏与枚举进行比较失败。
#include <stdio.h>
#define NUMBER 2
enum numbers
{
zero = 0,
one,
two,
three
};
int main ()
{
printf("NUMBER: %x and two: %x\n", NUMBER, two);
#if NUMBER == two
printf("#1-------PASS\n");
#else
printf("#1--------FAIL\n");
#endif
#if NUMBER == 2
printf("#2-------PASS\n");
#else
printf("#2--------FAIL\n");
#endif
if (NUMBER == two)
printf("#3-------PASS\n");
else
printf("#3--------FAIL\n");
}
我希望所有三个案例都通过。
实际结果:
NUMBER: 2 and two: 2
#1--------FAIL
#2-------PASS
#3-------PASS
#if
和宏的处理是在 C 程序的早期翻译阶段完成的。 IE。它是在 "preprocessing" 期间完成的。在这些阶段中,没有枚举器的概念(稍后处理)。预处理器只处理令牌,用一个令牌替换零个或多个其他令牌是它在那个阶段真正能做的。枚举是一种语义构造,而不仅仅是标记汤,所以同样,预处理器对此一无所知。
当您使用 two
时,预处理器会将其视为预处理标记,就像对待 NUMBER
一样。它将尝试替换它以产生一些有效条件。但它不是 #define
d,所以它使用回退行为。每个未定义但在 #if
中使用的标记都将替换为 0。因此,要检查的条件最终为:
#if 2 == 0
我正在尝试使用 #if 检查宏和枚举是否相等。即使两者具有相同的值,检查也会失败。为什么?
使用 #define NUMBER 2 创建了一个宏。创建了包含一个值为 2 的条目的枚举。使用 #if 比较了两者。与 2 比较的宏正在通过。但将宏与枚举进行比较失败。
#include <stdio.h>
#define NUMBER 2
enum numbers
{
zero = 0,
one,
two,
three
};
int main ()
{
printf("NUMBER: %x and two: %x\n", NUMBER, two);
#if NUMBER == two
printf("#1-------PASS\n");
#else
printf("#1--------FAIL\n");
#endif
#if NUMBER == 2
printf("#2-------PASS\n");
#else
printf("#2--------FAIL\n");
#endif
if (NUMBER == two)
printf("#3-------PASS\n");
else
printf("#3--------FAIL\n");
}
我希望所有三个案例都通过。 实际结果:
NUMBER: 2 and two: 2
#1--------FAIL
#2-------PASS
#3-------PASS
#if
和宏的处理是在 C 程序的早期翻译阶段完成的。 IE。它是在 "preprocessing" 期间完成的。在这些阶段中,没有枚举器的概念(稍后处理)。预处理器只处理令牌,用一个令牌替换零个或多个其他令牌是它在那个阶段真正能做的。枚举是一种语义构造,而不仅仅是标记汤,所以同样,预处理器对此一无所知。
当您使用 two
时,预处理器会将其视为预处理标记,就像对待 NUMBER
一样。它将尝试替换它以产生一些有效条件。但它不是 #define
d,所以它使用回退行为。每个未定义但在 #if
中使用的标记都将替换为 0。因此,要检查的条件最终为:
#if 2 == 0