清晰的命名規範能讓程式碼「一眼辨識」變數屬性,大幅降低閱讀認知負荷。筆者慣用的規則簡單且強健:
| 變數類別 | 命名規則 | 範例 |
|---|---|---|
| 結構體/C++ 類別成員變數 | 尾碼加單底線 _ | prev_, next_, addr_ |
| 函數參數 | 前綴加單底線 _ | _p_node, _p_key, _size |
| 區域變數 / 全域變數 | 無特殊前後綴 | addr, p_mnode, p_next |
typedef struct dll_node
{
struct dll_node *prev_; // 成員變數
struct dll_node *next_; // 成員變數
} dll_node_t;
// 函數參數皆以 _ 開頭
static bool mem_find_neighbor(dll_node_t *_p_node, void *_p_key)
{
// 區域變數無前後綴
maddr_t addr = *(maddr_t *)_p_key;
mnode_t *p_mnode = (mnode_t *)_p_node;
mnode_t *p_next = (mnode_t *)p_mnode->node_.next_; // 存取成員:node_.next_
if (p_next == 0 || p_mnode->addr_ > addr) {
return false;
}
// 尋找 addr 介於當前節點與下一節點之間的位置
if ((p_mnode->addr_ < addr) && (p_next->addr_ > addr)) {
return false;
}
return true;
}
函數內常需定義與參數同義的區域變數(如參數 _size,區域變數 size)。若無命名區分,常見做法是 size_temp、local_size,語義模糊。採用本規則:
_sizesize讀者瞬間理解:兩者語義相同,僅作用域不同,消除臨時變數命名煩惱。
g_(如 g_total_users),與區域變數區隔。s_ 前綴(如 s_instance)。MAX_BUFFER_SIZE)。MessageQueue)。clang-format、cpplint、EditorConfig 自動檢查。核心價值:命名規範不是為了「好看」,而是讓變數屬性(生命週期、作用域、所有權)在識別碼中顯性化,減少除錯時在腦中模擬作用域的心智負擔。