3. 标识符命名
标识符命名应遵循以下原则:
标识符命名要清晰明了,可以使用完整的单词和易于理解的缩写。短的单词可以通过去元音形成缩写,较长的单词可以取单词的头几个字母形成缩写。看别人的代码看多了就可以总结出一些缩写惯例,例如
count
写成cnt
,block
写成blk
,length
写成len
,window
写成win
,message
写成msg
,number
写成nr
,temporary
可以写成temp
,也可以进一步写成tmp
,最有意思的是internationalization
写成i18n
,词根trans
经常缩写成x
,例如transmit
写成xmt
。我就不多举例了,请读者在看代码时自己注意总结和积累。内核编码风格规定变量、函数和类型采用全小写加下划线的方式命名,常量(比如宏定义和枚举常量)采用全大写加下划线的方式命名,比如上一节举例的函数名
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],更不要使用匈牙利命名法。全局变量和全局函数的命名一定要详细,不惜多用几个单词多写几个下划线,例如函数名
radix_tree_insert
,因为它们在整个项目的许多源文件中都会用到,必须让使用者明确这个变量或函数是干什么用的。局部变量和只在一个源文件中调用的内部函数的命名可以简略一些,但不能太短。尽量不要使用单个字母做变量名,只有一个例外:用i
、j
、k
做循环变量是可以的。针对中国程序员的一条特别规定:禁止用汉语拼音做标识符,可读性极差。
[19] 大小写混合的命名方式是Modern C++风格所提倡的,在C++代码中很普遍,称为CamelCase),大概是因为有高有低像驼峰一样。