[英]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_ONE
被THING_ONE
替換一次,然后預處理器移動到下一個標記。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.