跳转到内容

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.”代码风格本来就是一个很有争议的问题,如果你接受本章介绍的内核编码风格(也是本书所有范例代码的风格),就不要使用大小写混合的变量命名方式 [1],更不要使用匈牙利命名法。

  3. 全局变量和全局函数的命名一定要详细,不惜多用几个单词多写几个下划线,例如函数名 radix_tree_insert ,因为它们在整个项目的许多源文件中都会用到,必须让使用者明确这个变量或函数是干什么用的。局部变量和只在一个源文件中调用的内部函数的命名可以简略一些,但不能太短。尽量不要使用单个字母做变量名,只有一个例外:用 ijk 做循环变量是可以的。

  4. 针对中国程序员的一条特别规定:禁止用汉语拼音做标识符,可读性极差。


  1. 大小写混合的命名方式是 Modern C++ 风格所提倡的,在 C++ 代码中很普遍,称为 CamelCase),大概是因为有高有低像驼峰一样。 ↩︎