前言
匈牙利命名法由微軟 Charles Simonyi 發明,透過變數前綴標示型別與用途,在早期弱型別語言(如 C)與無 IDE 環境下極具價值。雖然現代 C++ 配合強型別、智慧型編輯器與 auto 推導,其必要性大幅降低,但理解它對維護舊代碼、閱讀 Windows API 文檔仍不可或缺。
核心前綴對照表
| 前綴 | 含義 | 範例 |
| a | Array(陣列) | aItems |
| b | Boolean(布林) | bVisible |
| by | Byte(位元組) | byFlags |
| c | Char(有號字元) | cCh |
| cb | Char Byte(無號字元) | cbBuffer |
| cr | ColorRef(顏色參考) | crBack |
| cx, cy | 座標長度 (ShortInt) | cxWidth, cyHeight |
| dw | Double Word (DWORD) | dwSize |
| fn | Function(函數指標) | fnCallback |
| h | Handle(控制代碼) | hWnd, hFile |
| i | Integer(整數) | iCount |
| m_ | Member of class(成員變數) | m_nCount |
| n | Short Integer (short) | nPos |
| np | Near Pointer(近指標,16位遺物) | npData |
| p | Pointer(指標) | pNext |
| lp | Long Pointer(遠指標,32位) | lpBuffer |
| s | String(字串,非零結尾) | sName |
| sz | Zero-terminated String(以 \0 結尾) | szPath |
| tm | Text(文字內容) | tmCaption |
| w | Word (WORD, 16位無號) | wFlags |
| x, y | 座標 | xPos, yPos |
組合規則與順序
多前綴組合順序:範圍 → 指標層級 → 基礎型別 → 其他修飾
m_lpszStr
│ │ │ └─ 基礎型別:sz (零結尾字串)
│ │ └───── 指標層級:p (指標)
│ └──────── 指標層級:l (長指標/32位)
└────────── 範圍:m_ (成員變數)
意義:指向零結尾字串的長指標成員變數
常見變體與特例
- 類別成員:統一加
m_ 前綴,如 m_hWnd、m_nCount
- 全域/靜態變數:部分團隊用
g_、s_ 區分
- 函數參數:可用
p、n 等單一前綴,如 void SetCount(int nCount)
- MFC/ATL 類別:常見
C 前綴類名(CString、CWnd),成員變數用 m_,如 CStatusBar m_wndStatusBar(此處 wnd 非標準匈牙利)
現代 C++ 的觀點與建議
為何現代 C++ 較少使用?
- 型別系統強健:編譯器會檢查型別錯誤,前綴資訊冗餘
- IDE 支援豐富:滑鼠懸停即顯示型別、定義跳轉、重構工具完善
- auto 推導:
auto p = std::make_unique(); 型別一目瞭然
- 泛型程式設計:模板程式碼中型別不固定,前綴難以套用
- 可讀性爭議:
dwFlags vs flags,後者在強型別語言更簡潔
建議策略
- 新專案:採用 描述性命名(
windowHandle、itemCount),遵循核心指南
- 維護舊代碼:保持既有風格一致性,不要混用
- Windows API 互操作:參數命名可參考 API 慣例(
hWnd、lpRect),降低認知負擔
- 成員變數:保留
m_ 或 _ 後綴(count_)以區分區域變數,這在現代風格中仍被廣泛接受
結語
匈牙利命名法是特定歷史條件下的產物,理解其邏輯有助於閱讀經典代碼與系統 API,但現代 C++ 開發應優先採用清晰的描述性命名,配合強型別與工具鏈,寫出自文檔化的程式碼。
- 上一篇文章: C++Builder TList 類完整指南:屬性、方法與高效使用技巧
- 下一篇文章: C++ 語言基礎入門(一):變數、資料類型與基本操作
Copyright ©
程式碼之家 All Rights Reserved