这是一个简短的文档,描述了linux内核的首选编码风格。编码风格非常个人化,我不会强迫我对任何人的观点,但这是我必须能够维护的任何东西,而且我更喜欢它用于其他大多数事情。请至少考虑这里提出的观点。
首先,我建议打印出GNU编码标准的副本, 而不是阅读它。烧掉它们,这是一个伟大的象征性姿态。
无论如何,这里是:
第1章:缩进
标签为8个字符,因此缩进也是8个字符。 有些异端运动试图将缩进4(甚至2!)个字符深入,这类似于试图将PI的值定义为3。
理由:缩进背后的整个想法是明确定义在哪里
一个控制块开始和结束。特别是当你一直在寻找
在你的屏幕上连续20个小时,你会发现它更容易看到
如果你有大的缩进,缩进如何工作。
现在,有些人会声称有8个字符的缩进会使 代码向右移动太远,并且难以在80个字符的终端屏幕上阅读。答案是,如果你需要超过3个级别的缩进,你仍然会被搞砸,并且应该修复你的程序。
简而言之,8-char缩进使事情更容易阅读,并且当你将函数嵌套得太深时,还有一个额外的 好处就是警告你。注意那个警告。
在switch语句中缓和多个缩进级别的首选方法是 将“switch”及其下级“case”标签对齐在同一列而不是双缩进“case”标签。例如:
switch (suffix) {
case ‘G’:
case ‘g’:
mem <<= 30;
break;
case ‘M’:
case ‘m’:
mem <<= 20;
break;
case ‘K’:
case ‘k’:
mem <<= 10;
/* fall through */
default:
break;
}
除非您有隐藏的内容,否则不要在一行中放置多个语句 :
//counter-example
if (condition) do_this;
do_something_everytime;
不要在一行上放置多个作业。内核编码风格 非常简单。避免棘手的表达。
除了注释,文档和Kconfig之外,空格永远不会 用于缩进,上面的示例是故意破坏的。
得到一个体面的编辑器,不要在行尾留下空白。
第2章:打破长行和字符串
编码风格是关于使用常用工具的可读性和可维护性 。
线条长度的限制是80列,这是一个非常 优选的限制。
超过80列的语句将被分解为合理的块,除非 超过80列显着提高可读性并且不隐藏信息。后代总是比父母短得多,并且基本上放在右边。这同样适用于具有长参数列表的函数头。但是,永远不要破坏用户可见的字符串,例如printk消息,因为这会破坏grep的能力。
第3章:放置大括号和空格
C样式中总是出现的另一个问题是大括号的位置 。与缩进尺寸不同,选择一种放置策略的技术原因很少,但是先知Kernighan和Ritchie向我们展示的首选方法是将开口支撑放在最后一行,然后关闭先支撑,因此:
if (x is true) {
we do y
}
这适用于所有非函数语句块(if,switch,for, while,do)。 例如:
switch (action) {
case KOBJ_ADD:
return “add”;
case KOBJ_REMOVE:
return “remove”;
case KOBJ_CHANGE:
return “change”;
default:
return NULL;
}
但是,有一个特例,即函数:它们在下一行的开头有 开括号,因此:
int function(int x)
{
body of function
}
世界各地的异教徒都声称这种不一致 是…好吧…不一致,但是所有正确思考的人都知道(a)K&R是_right_和(b)K&R是对的。此外,函数无论如何都是特殊的(你不能将它们嵌套在C中)。
请注意,右括号中的右括号是__, 在后面跟着相同语句的延续的情况下,即do语句中的“while”或if语句中的“else” , 像这样:
do {
body of do-loop
} while (condition);
和
if (x == y) {
…
} else if (x > y) {
…
} else {
…
}
理由:K&R。
另外,请注意,此支撑位置还可以最大限度地减少空 (或几乎为空)线的数量,而不会降低可读性。因此,由于屏幕上新线的供应不是可再生资源(想想这里的25行终端屏幕),您可以有更多空行来发表评论。
不要在单个语句所做的情况下不必要地使用大括号。
if (condition)
action();
和
if (condition)
do_this();
else
do_that();
如果条件语句的只有一个分支是单个语句,则不适用 ; 在后一种情况下,在两个分支中使用大括号:
if (condition) {
do_this();
do_that();
} else {
otherwise();
}
3.1:空间
使用空间的Linux内核样式(主要)取决于 函数与关键字的使用。在(大多数)关键字之后使用空格。值得注意的例外是sizeof,typeof,alignof和__attribute__,它们看起来有点像函数(并且通常与Linux中的括号一起使用,尽管它们在语言中不是必需的,例如:“struct fileinfo”之后的“sizeof info”; “宣布)。
所以在这些关键字之后使用空格:
if,switch,case,for,do,while
for (i = 10; i <= 10; i++){
…
}
但不是sizeof,typeof,alignof或__attribute__ 。例如,