像所有其他大型软件一样,Linux 制定了一套编码风格,对代码的格式,风格和布局做出了规定。下面我就对 2.6 内核中的代码约定进行介绍。

      1.缩进

      缩进风格是用制表位(Tab)每次缩进 8 个字符长度。这里指的并不是利用 8 个空格进行缩进。这里的规定很明确,每次缩进通过制表位进行,每个制表位 8 个字符长度。(这里是不是有点奇怪,我们在编程时是不是用 4 个字符缩进就行了?)

      下面,就看看这个例子中的缩进:(以下代码来自:《Linux内核设计与实现》)



static void get_new_ship(const char *name)
{
	if(!name)
		name = DEFAULT_SHIP_NAME;
	get_new_ship_with_name(name);
}

     

很是奇怪,不知道为什么 Linus 为什么规定要缩进八个字符,这样,如果内嵌的层次太多,不是一行就不够用了吗?(一行不能超过 80 个字符)好在,Linus 又说不应当嵌套太复杂的逻辑。如果真的需要多层缩进,他建议,应当重构你的代码,把复杂的层次关系分解为独立的功能。


      2. switch 语句

      Switch 语句下属的 case 标记应该缩进到和 switch 声明对齐,这样有助于减少 8 个字符的 tab 缩进带来的排版缩进,比如:



switch (animal) {
case ANIMAL_CAT:
	handle_cats();
	break;
case ANIMAL_WOLF:
	handle_wolves();
	/* fall through*/
case ANIMAL_DOG:
	handle_dogs();
	break;
default:
	printk(KERN_WARNING "Unknown animal %d!\n", animal);
}

     

当执行逻辑需要有意的从一个 case 声明尾部进入另一个 case 声明时,对齐进行评注无疑是一个普通的实践经验,正如在代码中我们可以看到第二个 case 执行完之后直接进入第三个 case 而不做判断。这一点是为了避免你忘记了写 break ,而不知道哪里出现了错误。


      3.空格

      通常在编程的时候,我们都会给符号和关键字加上空格,这点在 Linux 内核的编码中也不例外。一般来说, Linux 的编码风格规定,空格放在关键字周围,函数名和圆括号之间没有空格。例如:



if (foo)
while (foo)
for (i = 0; i < NR_CPUS; i++)
switch (foo)

     

注意,在提领运算符的周围加上合适的空格尤为重要。正确的风格是:

char *strcpy(char *dest, const char *src)

      在提领运算符的一边加上空格是不良的风格:
      char * strcpy(char * dest, const char * src)   /*BAD STYLE*/

      把提领运算符放在紧挨类型的地方也是借用 C++ 风格的一种不良作风:

char* strcpy(char* dest, const char* src)      /*BAD STYLE*/

      4.花括号

      花括号的使用不存在技术上的差异,完全是个人喜好问题,但是我们还是必须宣传一致的风格。内核选定的风格是左括号紧跟在语句的最后,与语句在相同的一行。而右括号要新起一行,作为该行的第一个字符。

      注意,如果接下来的标示符是相同语句块的一部分,那么右花括号就不单独占一行,而是与那个标示符在同一行。

      下面,仅根据上面提出的两点给出示例:



if (strncmp(buf, "NO_", 3) == 0) {
	neg = 1;
	cmp += 3;
} else {
	neg = 0;
	cmp -= 3;
}