簡體   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