C语言最佳实践
上QQ阅读APP看书,第一时间看更新

1.3.1 Linux内核编码风格的一些规定

众所周知,Linux内核的发展已逾30年。作为目前全球使用最为广泛的开源操作系统,一方面,Linux已经成为使用C语言编写大型基础软件工程项目的全球典范;另一方面,Linux也是目前最为成功的全球性开源协作项目。可以说,Linux内核是每一位C程序员取之不尽、用之不竭的宝库。作为一名C程序员,学习Linux内核的编码风格,并有意向其靠近,是绝对正确的选择。

这里以缩进和注释为例介绍Linux内核的编码风格。完整的Linux内核编码风格文档,可通过在任意搜索引擎中搜索Linux kernel coding style阅读。

Linux内核的编码风格规定,代码的缩进应该采用制表符(Tab),宽度为8个空格(和Windows操作系统中大多数编辑器或字处理软件常使用4个空格不同)。例如:

int system_is_up(void)
{
        return system_state == SYSTEM_RUNNING;
}

这个规定有什么好处呢?Linux内核的编码风格还规定每一行代码的长度不得超过80个字符。按照“Linux之父”Linus的说法,如果代码的缩进或嵌套超过3个层次,就要考虑对代码进行重构。因此 8 个空格的缩进可以有效地限制缩进或嵌套的层次,迫使程序员在编写代码时不要采用过多的嵌套或缩进。

当然,8个空格的缩进要求确实有些严苛,读者也可以酌情在自己的代码中采用4个空格的缩进,但4个空格应该是底线,再少就不合适了。

Linux内核的编码风格还禁止采用C编程语言的“//”注释方式(这和Linus不喜欢C++编程语言有一些关系)。Linux内核采用的单行注释形式如下:

/* This is a single-line comment. */

Linux内核采用多行注释形式如下:

/*
 * This is the preferred style for multi-line
 * comments in the Linux kernel source code.
 * Please use it consistently.
 *
 * Description: A column of asterisks on the left side,
 * with beginning and ending almost-blank lines.
 */

除此之外,在Linux内核的编码风格中,还特别说明不要针对结构体使用typedef定义新的数据类型,而应该始终使用struct foo这样的形式。

作为一个重要的经验性约定,Linux内核的编码风格要求所有的函数在末尾集中返回。也就是说,应避免在一个函数的头部或中部使用return语句。因此,我们可以在Linux内核的源代码中看到被传统编程教材强烈否定的goto语句的频繁使用。本章后面将解释这一做法的好处。这类规定属于经验性约定,在某种程度上可以规范某些编码行为,从而提高代码的一致性和质量,属于可维护性的范畴。