Linux C语言代码风格

本文档详细介绍了Linux内核C语言编程的编码风格,包括缩进、行宽、大括号放置、空格使用、命名规则、函数设计、宏和内联汇编等方面的规范。强调了8个字符的缩进、不超过80列的行宽限制、函数应简短且单一职责、避免过度注释等原则。同时,文档提倡使用描述性变量和函数名,以及在适当情况下使用内联函数和引用计数。
摘要由CSDN通过智能技术生成

这是一个简短的文档,描述了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__ 。例如,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值