// 枚舉定義攝像頭分辨率類型
enum {
OV_720P,
OV_2M,
OV_3M,
OV_5M,
};
// 解析度配置表(結構體數組)
typedef struct {
int width;
int height;
// ... 其他參數
} Resolution;
Resolution ov_resolutions[] = {
[OV_720P] = {1280, 720},
[OV_2M] = {1600, 1200},
[OV_3M] = {2048, 1536},
[OV_5M] = {2592, 1944},
};
// 業務邏輯:根據寬度匹配分辨率類型
if (width == ov_resolutions[OV_720P].width) {
// 處理 720P
} else if (width == ov_resolutions[OV_2M].width) {
// 處理 2M
} else if (width == ov_resolutions[OV_3M].width) {
// 處理 3M
} else if (width == ov_resolutions[OV_5M].width) {
// 處理 5M
} else {
return -EINVAL; // 不支持的分辨率
}
| 特性 | enum 枚舉 | #define 宏 |
|---|---|---|
| 類型安全 | ✅ 編譯器類型檢查 | ❌ 純文本替換 |
| 調試可見性 | ✅ 符號表中可見 | ❌ 預處理階段消失 |
| 作用域控制 | ✅ 支持作用域 | ❌ 全局污染 |
| 動態增刪改 | ✅ 插入/刪除自動重排值 | ❌ 手動維護數值 |
| 代碼可讀性 | ✅ 語義清晰 | ⚠️ 魔術數字 |
enum State {
STATE_IDLE,
STATE_CONNECTING,
STATE_CONNECTED,
STATE_DISCONNECTING,
STATE_MAX // 必須放最後,自動獲得狀態總數
};
void (*state_handlers[STATE_MAX])(void) = {
[STATE_IDLE] = handle_idle,
[STATE_CONNECTING] = handle_connecting,
[STATE_CONNECTED] = handle_connected,
[STATE_DISCONNECTING]= handle_disconnecting,
};
// 狀態轉換
current_state = STATE_CONNECTING;
state_handlers[current_state](); // 直接調用對應處理函數
enum ConfigID {
CFG_WIFI_SSID,
CFG_WIFI_PASS,
CFG_SERVER_IP,
CFG_SERVER_PORT,
CFG_MAX
};
const char* config_defaults[CFG_MAX] = {
[CFG_WIFI_SSID] = "default_ssid",
[CFG_WIFI_PASS] = "default_pass",
[CFG_SERVER_IP] = "192.168.1.1",
[CFG_SERVER_PORT] = "8080",
};
// 統一讀取/寫入接口
const char* get_config(enum ConfigID id) {
return (id < CFG_MAX) ? config_values[id] : NULL;
}
MAX 成員獲取總數:定義數組大小、循環邊界[ENUM] = value:C99 標準,明確映射關係static_assert 確保數組與枚舉同步這種模式在嵌入式驅動開發、協議解析、狀態機實現中極為常見,能顯著減少魔術數字、提高代碼可維護性。