簡體   English   中英

C 中的枚舉內部宏

[英]Macro inside enum in C

嘗試在枚舉中編寫宏時,在 C 中。 我們有時必須在宏定義上面寫宏的名稱,為什么?

#include <stdio.h>

enum month {    

        MSD //If I remove or comment this line, code does not work, why?
        #define MSD 7
};

void main() {
        printf("%d\n", MSD);
}

如果我們刪除第 5 行代碼,即“MSD”。 我們得到錯誤empty enum is invalid 為什么會發生這種情況,請有人解釋一下嗎?

宏和枚舉是分開的東西。 最重要的是,宏僅在編譯時存在,因此預處理器會將以下代碼中的所有MSD實例替換為7 ,就像您在編輯器中進行了查找和替換一樣。 另一方面,枚舉存在於運行時,通常是映射到符號的數值。

現在,使用您的代碼,您的printf("%d\n", MSD); 在編譯時被替換為7 ,因此從未實際使用枚舉。 如果刪除第 5 行代碼,編譯器會看到一個空枚舉,因為#define MSD 7宏被預處理器過濾掉,枚舉中沒有其他內容。

如果打算定義一個枚舉。 我們可以定義如下。 (我們可以以#define 的枚舉形式定義 MSD,其中任何一個都需要在代碼中使用“MSD”作為值 7)

    #include <stdio.h>

    enum month {
            MSD = 7,
            TST = 1 // added just for ref
    };
    // in linux requires int main() { <code> return 0;}
    void main() {
            printf("enum MSD == %d\n", MSD);
    }

MSD與上面的聲明無關#define MSD 7 ,錯誤的原因是enum{ }; 不應為空。

如果枚舉為空,則會出現以下錯誤。

main.c:12:1: 錯誤:空枚舉無效 };

嘗試在那里聲明另一個enum值而不是MSD ,它將如下所示工作。

#define是文本替換,它們不需要任何聲明,只需要定義。

#include <stdio.h>

enum month {    
        x = 0
        //MSD //If I remove or comment this variable declaration, code does not work, why?
        #define MSD 7
};

void main() {
        printf("%d\n", MSD);
}

我正在閱讀 header 文件的源代碼,想知道他們為什么要這樣編寫宏,我在其中發布了

我認為您可能誤讀了 header 文件,該文件正在執行此稍有不同的操作:

enum thing_enum {
    THING_ONE = 1,
#define THING_ONE THING_ONE
    THING_TWO,
#define THING_TWO THING_TWO
    // etc
};

這與編寫普通的枚舉聲明相同

enum thing_enum {
    THING_ONE = 1,
    THING_TWO,
    // etc
};

然后,還將每個枚舉器定義為擴展為自身的宏:

#define THING_ONE THING_ONE
#define THING_TWO THING_TWO
// etc

以這種方式編寫,當您注釋掉代碼中的“MSD”行時應該更清楚為什么會出現錯誤: #define對枚舉的定義沒有任何貢獻,因此您有一個沒有值的枚舉,語言不允許的。

Header 文件做了這個看起來很奇怪的事情,因為它使每個THING_常量既是宏又是枚舉值,這意味着您可以使用enum的所有功能來設置它們的值(例如,在我的示例中THING_TWO等於 2 而我沒有必須明確地說)並且名稱將對調試器可見,但仍然可以使用#ifdef檢查特定常量的存在。

缺點是它會使常量集的定義長度加倍,不能將每個常量的類型設為除int以外的任何類型,並且常量不能在#if表達式中使用(除了作為defined的參數) .

(注意:擴展為自身的宏不會將預處理器置於無限循環中THING_ONETHING_ONE替換一次,然后預處理器移動到下一個標記。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM