當變數僅有有限離散取值(星期、狀態碼、錯誤代碼)時,枚舉提供 型別安全、自文檔化、除錯友善 的優雅方案,優於 #define 巨集。
enum Day { Mon=1, Tue, Wed, Thu, Fri, Sat, Sun };
enum Day today, tomorrow;
today = Mon;
enum { Sat, Sun=0, Mon, Tue, Wed, Thu, Fri } workday;
enum Week { Mon=1, Tue, Wed, Thu, Fri, Sat, Sun } days;
typedef enum { Mon=1, Tue, Wed, Thu, Fri, Sat, Sun } Weekday;
Weekday today = Mon;
day = (Weekday)3;,直接賦值會警告。typedef enum {
READ = 1 << 0, // 0x01
WRITE = 1 << 1, // 0x02
EXEC = 1 << 2, // 0x04
RW = READ | WRITE
} Permission;
typedef enum { IDLE, CONNECTING, CONNECTED, ERROR } State;
State current = IDLE;
void handle_event(Event e) {
switch (current) {
case IDLE: if (e == EV_START) current = CONNECTING; break;
case CONNECTING: if (e == EV_OK) current = CONNECTED; break;
// ...
}
}
枚舉子無字串屬性,需自行對映:
const char *state_str[] = { "IDLE", "CONNECTING", "CONNECTED", "ERROR" };
printf("State: %s\n", state_str[current]);
| 錯誤代碼 | 問題 | 修正 |
|---|---|---|
enum {A, B}; enum {A, C}; | 同作用域重複枚舉子 | 改用 enum Class {A, B} 作用域隔離(C23)或前綴命名 |
Weekday w = 5; | 隱式整數轉換警告 | Weekday w = (Weekday)5; |
printf("%s", Mon); | 嘗試列印枚舉子為字串 | 使用對映表或 X macro 技巧 |
sizeof(Weekday) != sizeof(int) | 假設大小固定 | 標準僅保證能容納所有值,實作定義 |
enum : byte { A, B }; 指定底層型別(char/short/int)。enum class Color { Red, Green }; 強型別枚舉,隱式轉換被禁止。static_assert 驗證枚舉值範圍。