为什么我不能使用#if比较宏和枚举?

Jop*_*mas 3 c macros enums preprocessor

我正在尝试使用#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");
}
Run Code Online (Sandbox Code Playgroud)

我期望这三种情况都能通过。实际结果:

NUMBER: 2 and two: 2
#1--------FAIL
#2-------PASS
#3-------PASS
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 5

#if和宏的处理是在C程序的早期翻译阶段完成的。也就是说,它是在“预处理”期间完成的。在那些阶段中,没有枚举器的概念(稍后将进行处理)。预处理器仅处理令牌,并且在该阶段实际上可以做的就是用一个令牌替换零个或多个其他令牌。枚举是一种语义构造,而不仅仅是令牌汤,因此,预处理器对此一无所知。

使用时two,预处理器会将其视为预处理令牌NUMBER。它将尝试替代它以产生一些有效条件。但这不是#defined,因此它使用后备行为。每个未定义但在中使用的令牌都#if用0代替。因此要检查的条件最终是:

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