enum 定義一組有名字的整數常量,本質是 int 類型,編譯器自動分配序號(從 0 開始遞增)。
enum ABC { AAA, BBB, CCC }; // AAA=0, BBB=1, CCC=2
enum ABC e1 = AAA, e2 = BBB, e3 = CCC;
printf("%d, %d, %d\n", e1, e2, e3); // 輸出 0, 1, 2
enum ABC { AAA, BBB, CCC } e1 = BBB, e2 = BBB+1, e3 = e2-2;
// 甚至省略枚舉名
enum { AAA, BBB, CCC } e = BBB;
enum ABC { AAA=2, BBB, CCC=9 } e1, e2, e3;
// AAA=2, BBB=3(自動+1), CCC=9
enum ABC { AAA=2, BBB=2, CCC } e1, e2, e3;
// AAA=2, BBB=2(重複允許), CCC=3
int,枚舉變量類型為該枚舉類型(兼容 int)。int,但 int 賦值給枚舉變量可能需強轉(C++ 強制)。int),不可假設為 char/short。
enum State { IDLE, RUNNING, PAUSED, ERROR };
enum State current = IDLE;
void handle_event(Event e) {
switch (current) {
case IDLE: if (e == START) current = RUNNING; break;
case RUNNING: if (e == PAUSE) current = PAUSED;
else if (e == STOP) current = IDLE; break;
case PAUSED: if (e == RESUME) current = RUNNING; break;
case ERROR: /* ... */ break;
}
}
enum Flags { READ = 1<<0, WRITE = 1<<1, EXEC = 1<<2 };
int perm = READ | WRITE; // 3
if (perm & WRITE) { /* 可寫 */ }
enum Color : uint8_t { RED, GREEN, BLUE }; (C23),節省空間並確保 ABI 穩定。enum class(類 C++11 enum class),防止常量污染全局命名空間。_Generic 或宏實現枚舉轉字符串。| 特性 | enum | #define | const int |
|---|---|---|---|
| 類型安全 | 有 (C23 強) | 無 | 有 |
| 調試可見性 | 符號表可見 | 預處理器移除 | 符號表可見 |
| 分組關聯 | 天然分組 | 無 | 無 |
| 序號自動管理 | 自動遞增 | 手動 | 手動 |
| 位運算支援 | 需手動定義值 | 同 | 同 |
枚舉是 C 語言定義相關常量組的標準方式,提供類型語義、自動編號、調試可見性。善用顯式賦值控制序號、配合位運算實現標誌位、結合 switch 實現狀態機,可顯著提升代碼可讀性與可維護性。現代 C 标准進一步增強了類型安全與底層類型控制能力。