像所有其他大型软件一样,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;
}