首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C/C++ 枚舉技巧:用 enum 定義陣列大小消除 Magic Number

     編輯:關於C++

演進歷程

版本 1:分散變數

int nCntHttp = 0, nCntFtp = 0, nCntSmtp = 0, nCntSsh = 0;

新增協議需增變數、增 printf/assert,維護惡夢。

版本 2:陣列 + 註解

int nCntProto[4]; // 0:HTTP, 1:FTP, 2:SMTP, 3:SSH

可迴圈處理,但出現 **Magic Number** [2],順序變動即全線崩壞。

版本 3:enum 命名索引

enum PROTO { PROTO_HTTP, PROTO_FTP, PROTO_SMTP, PROTO_SSH };
int nCntProto[4];
nCntProto[PROTO_SMTP]++; // 可讀、順序調整只改 enum

消除索引 Magic Number,但陣列大小 4 仍硬編碼。

版本 4 (終極版):enum 尾端計數器

enum PROTO {
    PROTO_HTTP,
    PROTO_FTP,
    PROTO_SMTP,
    PROTO_SSH,
    PROTO_NUM  // 自動等於元素個數 (此處為 4)
};
int nCntProto[PROTO_NUM]; // 無任何 Magic Number

// 遍歷
for (int i = 0; i < PROTO_NUM; ++i) print(nCntProto[i]);

新增協議只需在 PROTO_NUM 前插入枚舉值,PROTO_NUM 自動遞增,**所有用處零修改**。

C++ 現代化補充

// 配合 std::vector
std::vector vctCntProto(PROTO_NUM);

// 或 C++17 std::array
std::array arrCntProto{};

適用場景

  • 狀態機狀態計數
  • 協議/命令類型統計
  • 查表驅動程式碼
  • 任何「固定集合、需索引、可能擴充」的場景

注意事項

  • PROTO_NUM **必須置於枚舉末尾**。
  • 若需特定數值 (如協議號),顯式指定:PROTO_HTTP = 80, PROTO_HTTPS = 443, PROTO_NUM → PROTO_NUM 將為 444,**不再等於個數**。此時應改用獨立 constexpr size_t PROTO_COUNT = 4;。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved