3. 標識符命名

標識符命名應遵循以下原則:

  1. 標識符命名要清晰明了,可以使用完整的單詞和易於理解的縮寫。短的單詞可以通過去元音形成縮寫,較長的單詞可以取單詞的頭幾個字母形成縮寫。看別人的代碼看多了就可以總結出一些縮寫慣例,例如count寫成cntblock寫成blklength寫成lenwindow寫成winmessage寫成msgnumber寫成nrtemporary可以寫成temp,也可以進一步寫成tmp,最有意思的是internationalization寫成i18n,詞根trans經常縮寫成x,例如transmit寫成xmt。我就不多舉例了,請讀者在看代碼時自己注意總結和積累。

  2. 內核編碼風格規定變數、函數和類型採用全小寫加下劃線的方式命名,常量(比如宏定義和枚舉常量)採用全大寫加下劃線的方式命名,比如上一節舉例的函數名radix_tree_insert、類型名struct radix_tree_root、常量名RADIX_TREE_MAP_SHIFT等。

    微軟髮明了一種變數命名法叫匈牙利命名法(Hungarian notation),在變數名中用首碼表示類型,例如iCnt(i表示int)、pMsg(p表示pointer)、lpszText(lpsz表示long pointer to a zero-ended string)等。Linus在[CodingStyle]中毫不客氣地諷刺了這種寫法:“Encoding the type of a function into the name (so-called Hungarian notation) is brain damaged - the compiler knows the types anyway and can check those, and it only confuses the programmer. No wonder MicroSoft makes buggy programs.”代碼風格本來就是一個很有爭議的問題,如果你接受本章介紹的內核編碼風格(也是本書所有範例代碼的風格),就不要使用大小寫混合的變數命名方式[19],更不要使用匈牙利命名法。

  3. 全局變數和全局函數的命名一定要詳細,不惜多用幾個單詞多寫幾個下劃線,例如函數名radix_tree_insert,因為它們在整個項目的許多源檔案中都會用到,必須讓使用者明確這個變數或函數是幹什麼用的。局部變數和只在一個源檔案中調用的內部函數的命名可以簡略一些,但不能太短。儘量不要使用單個字母做變數名,只有一個例外:用ijk做循環變數是可以的。

  4. 針對中國程序員的一條特別規定:禁止用漢語拼音做標識符,可讀性極差。



[19] 大小寫混合的命名方式是Modern C++風格所提倡的,在C++代碼中很普遍,稱為CamelCase),大概是因為有高有低像駝峰一樣。