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

时间:2019-06-10 07:13:36

标签: c enums macros preprocessor

我正在尝试使用#if检查宏和枚举是否相等。即使两者的值相同,检查也会失败。为什么?

使用#define NUMBER 2创建宏。创建的enum包含一个值为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

1 个答案:

答案 0 :(得分:5)

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

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

#if 2 == 0