繁体   English   中英

为什么我不能使用#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程序的早期翻译阶段完成的。 即它是在“预处理”期间完成的。 在这些阶段期间,没有调查员的概念(稍后处理)。 预处理器只处理令牌,用一个令牌代替零个或多个其他令牌就是它在那个阶段真正可以做的。 枚举是一种语义结构,不仅仅是令牌汤,因此预处理器一无所知。

当您使用two ,预处理器会将其视为预处理令牌,与处理NUMBER相同。 它会尝试用它来代替它来产生一些有效的条件。 但它不是#define d,所以它使用了回退行为。 未定义但在#if使用的每个标记都被替换为0.因此检查的条件最终为:

#if 2 == 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM