空白缩进

空白字符

  • 关键字ifwhilefor与其后的控制表达式的(括号之间插入一个空格分隔,但括号内的表达式应紧贴括号.
while (1)
  • 双目运算符的两侧各插入一个空格分隔,单目运算符和操作数之间不加空格.
  • ,号和;号之后要加空格,这是英文的书写习惯.
  • 以上关于双目运算符和后缀运算符的规则并没有严格要求,有时候为了突出优先级也可以写得更紧凑一些.
  • UNIX系统标准的字符终端是24行80列的,接近或大于80个字符的较长语句要折行写.
  • 有的人喜欢在变量定义语句中用Tab字符,使变量名对齐,这样看起来很美观.
int        a,b;
double    c;

代码缩进

  • if/elsewhiledo/whileforswitch这些可以带语句块的语句,语句块的{或}应该和关键字写在同一行,用空格隔开,而不是单独占一行.
if (...) {
       //语句列表
} else if (...) {
       //语句列表
}
  • 函数定义的{和}单独占一行,这一点和语句块的规定不同.
  • switch和语句块里的casedefault对齐写,也就是说语句块里的casedefault标号相对于switch不往里缩进,但标号下的语句要往里缩进.
  • 代码中每个逻辑段落之间应该用一个空行分隔开。例如每个函数定义之间应该插入一个空行,头文件、全局变量定义和函数定义之间也应该插入空行.
  • 一个函数的语句列表如果很长,也可以根据相关性分成若干组,用空行分隔。这条规定不是严格要求,通常把变量定义组成一组,后面加空行,return语句之前加空行.

注释

  • 整个源文件的顶部注释。说明此模块的相关信息,例如文件名、作者和版本历史等,顶头写不缩进.
  • 函数注释。说明此函数的功能、参数、返回值、错误码等,写在函数定义上侧,和此函数定义之间不留空行,顶头写不缩进.
  • 相对独立的语句组注释。对这一组语句做特别说明,写在语句组上侧,和此语句组之间不留空行,与当前语句组的缩进一致.
  • 代码行右侧的简短注释。对当前代码行做特别说明,一般为单行注释,和代码之间至少用一个空格隔开,一个源文件中所有的右侧注释最好能上下对齐.
  • 函数内的注释要尽可能少用。写注释主要是为了说明你的代码“能做什么”(比如函数接口定义),而不是为了说明“怎样做”,只要代码写得足够清晰,“怎样做”是一目了然的,如果你需要用注释才能解释清楚,那就表示你的代码可读性很差,除非是特别需要提醒注意的地方才使用函数内注释.
  • 复杂的结构体定义比函数更需要注释.
  • 复杂的宏定义和变量声明也需要注释.

标识符命名

  • 标识符命名要清晰明了,可以使用完整的单词和易于理解的缩写。短的单词可以通过去元音形成缩写,较长的单词可以取单词的头几个字母形成缩写.
  • 内核编码风格规定变量、函数和类型采用全小写加下划线的方式命名,常量(比如宏定义和枚举常量)采用全大写加下划线的方式命名.
  • 全局变量和全局函数的命名一定要详细,不惜多用几个单词多写几个下划线,因为它们在整个项目的许多源文件中都会用到,必须让使用者明确这个变量或函数是干什么用的.
  • 局部变量和只在一个源文件中调用的内部函数的命名可以简略一些,但不能太短.尽量不要使用单个字母做变量名,只有一个例外:用ijk做循环变量是可以的.
  • 大小写混合的命名方式是Modern C++风格所提倡的,在C++代码中很普遍,称为CamelCase.

函数

  • 实现一个函数只是为了做好一件事情,不要把函数设计成用途广泛、面面俱到的,这样的函数肯定会超长,而且往往不可重用,维护困难.
  • 函数内部的缩进层次不宜过多,一般以少于4层为宜。如果缩进层次太多就说明设计得太复杂了,应考虑分割成更小的函数(Helper Function)来调用.
  • 函数不要写得太长,建议在24行的标准终端上不超过两屏,太长会造成阅读困难,如果一个函数超过两屏就应该考虑分割函数了.
  • 执行函数就是执行一个动作,函数名通常应包含动词.
  • 比较重要的函数定义上侧必须加注释,说明此函数的功能、参数、返回值、错误码等.
  • 另一种度量函数复杂度的办法是看有多少个局部变量,5到10个局部变量已经很多了,再多就很难维护了,应该考虑分割成多个函数.

参考资料

Linux C编程-编码风格