![C语言最佳实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/885/53286885/b_53286885.jpg)
1.3 编码风格的内容
相信读者已经大致了解具有良好可读性的代码应该是什么样子,或者可以大致体会出不同的编码风格对代码可读性带来的影响。
良好的编码风格(coding style)是极其重要的,Linux内核就是一个很好的例子。由于Linux内核的代码需要被成千上万的程序员阅读,因此为了保证代码的良好可读性,Linux内核在编码风格上的要求可以用严苛来形容。当我们向Linux内核提交一个拉取请求(pull request,我们可以将拉取请求理解为对代码进行修改之后的合并请求)时,如果编码风格不符合规定,则不管修改的内容如何,都会被拒绝。因此,我们在编写代码时一定要保证代码具有良好的编码风格。
那么,为了养成良好的编码风格,我们需要注意哪些方面呢?首先,代码应该满足良好的排版规则,包括缩进、空格、换行以及大括号的正确位置等。本章后面将以Linux内核的编码风格为例,详细介绍这方面的规则。
其次,代码应该遵循统一的命名规则。常见的命名规则有K&R命名法和驼峰命名法两种。K&R命名法是Kernighan和Ritchie在《C编程语言》一书中所采用的命名规则。这种规则用小写形式的单词和下画线组合对变量和函数进行命名,如this_is_an_integer
。驼峰命名法源自匈牙利籍程序员Charles Simonyi在微软任职期间提出的匈牙利命名法,因微软在Win32 API及其示例代码中广泛采用这一命名规则而广为人知。匈牙利命名法约定了变量的命名由其类型缩写和首字母大写的单词组成,如iThisIsAnInterger
。随后这一命名法被广泛用于其他编程语言,如Java、JavaScript等。在使用匈牙利命名法时,由于大写字母通常会凸出来,因此这种命名法在用于其他编程语言时,常被称为驼峰命名法。
知识点:Win32
Win32是Windows操作系统发展到3.0版本,开始支持32位的80386处理器时,微软为Windows操作系统设计的底层基础API所取的名字,意指针对32位平台的Windows API。
K&R命名法和驼峰命名法都是常用的命名规则,至于哪个好哪个坏,实在是“萝卜白菜各有所爱”的事情。但是在同一项目中,应该采用统一的规则,一般不建议混用。通常,K&R命名法在C代码中更为常见;而驼峰命名法除在Win32代码中之外,在面向对象编程语言(如C++、Java、Python)中更为常见,但有细微差别,比如在面向对象编程语言中,对属性或方法则经常使用setLocale
这样的命名习惯(即首字母缩写)。
除了变量名和函数名,宏名、枚举常量名、全局变量名也应该遵循统一的命名规则。例如,宏名一般采用全大写形式,为避免混淆,通常会添加一些前缀,并使用下画线分隔不同的单词。枚举常量名则以字母K开头,表示常量(常量对应的constant一词的发音以k打头)。程序内部使用的全局变量,其名称前还会添加一两个下画线作为前缀,这样做是为了防止命名污染,避免一些潜在的问题(如符号冲突、链接错误等)。
知识点:命名污染
通俗来讲,命名污染(naming pollution)就是指“重名”。重复的函数名、变量名、宏名会造成很多问题。简单的如编译警告或错误,或者链接生成可执行文件时报“重复的符号”错误,复杂的如重复的全局变量名和局部变量名导致程序执行异常,这些问题均可能需要程序员浪费大量时间来排查。由于设计上的问题,C语言一直未引入类似C++或其他编程语言对命名空间(naming space)的支持,这容易导致命名污染的产生。
编码风格的其他规则还包括自定义类型的使用、条件编译的写法、注释的写法,以及一些常见的约定写法。约定的写法通常来自经验的总结,比如如何处理系统可移植性、如何处理处理器架构的可移植性、如何实现国际化和本地化等。