enum 定義一組命名整數常量,增強代碼可讀性,編譯器可做類型檢查(部分),調試器顯示符號名而非數字。
enum Weekday { SUN, MON, TUE, WED, THU, FRI, SAT };
// SUN=0, MON=1, ..., SAT=6
enum Weekday { SUN = 9, MON, TUE, WED, THU, FRI, SAT };
// SUN=9, MON=10, ..., SAT=15
enum Weekday { SUN = 9, MON, TUE, WED = 3, THU, FRI, SAT };
// SUN=9, MON=10, TUE=11, WED=3, THU=4, FRI=5, SAT=6
enum Weekday { SUN = 9, MON = 5, TUE, WED = 3, THU = 7, FRI = 2, SAT = 9 };
// SUN=9, MON=5, TUE=6, WED=3, THU=7, FRI=2, SAT=9 (SUN與SAT同值)
// 定義枚舉類型同時聲明變量
enum Weekday { SUN, MON, TUE, WED, THU, FRI, SAT } a, b, c;
// 後續聲明
enum Weekday d, e, f;
// 賦值
a = SUN; b = MON; c = TUE;
d = WED; e = THU; f = FRI;
printf("%d,%d,%d,%d,%d,%d\n", a,b,c,d,e,f); // 輸出: 0,1,2,3,4,5
| 規則 | 說明 | 示例 |
|---|---|---|
| 枚舉常量為 int 類型 | 兼容 int 運算,但建議保持類型語義 | int x = MON + 1; // 合法但失去語義 |
| 賦值表達式必須為編譯期常量 | 不能用變量/函數調用 | enum { A = foo() }; // 錯誤 |
| 作用域遵循普通標識符規則 | 同一作用域內枚舉常量名不可重復 | enum { X }; enum { X }; // 錯誤 |
| 匿名枚舉常量注入當前作用域 | enum { RED, GREEN }; 直接使用 RED | 常用於常量組定義 |
C++11 enum class 強類型枚舉 | 不隱式轉 int,作用域隔離,需 Color::RED | 現代 C++ 首選,C 不支援 |
enum FilePerm {
READ = 1 << 0, // 0x01
WRITE = 1 << 1, // 0x02
EXEC = 1 << 2, // 0x04
RW = READ | WRITE, // 0x03
RWX = READ | WRITE | EXEC // 0x07
};
int perm = READ | WRITE; // 組合權限
if (perm & EXEC) { /* 可執行 */ }
枚舉本質是編譯期整數常量的別名表。善用默認遞增減少維護成本,關鍵值顯式指定避免耦合,位掩碼模式構建類型安全標誌位。**現代 C++ 請優先使用 enum class**,C 語言中保持「枚舉名大寫、值語義清晰」即可寫出可維護代碼。