Tab缩进: 8个字符
8个字符的缩进可以让代码更容易阅读,还可以在你的函数嵌套太深的时候给你警告.
如果需要 3 级以上的缩进,说明你的代码有问题,应该修正你的程序。
不要使用空格来缩进.
switch语句: 让switch和从属的case标签对齐于同一列.
Example:
switch(suffix){
case 'G':
case 'g':
mem <<= 30;
break;
default:
break;
}
行长度
不要把多个语句放在一行.
每一行的长度的限制是 80 列,我们强烈建议您遵守这个惯例。
长于 80 列的语句要打散成有意义的片段。每个片段要明显短于原来的语句, 而且放置的位置也明显靠右。
同样的规则也适用于有很长参数列表的函数头。
长字符串也要打散成较短的字符串。唯一的例外是超过 80 列可以大幅度提高可读性并且不会隐藏信息的情况。
Example:
void fun(int a, int b, int c){
if (condition)
printk(KERN_WARNING "Warning this is a long printk with "
"3 parameters a: %u b: %u "
"c: %u \n", a, b, c);
else
next_statement;
}
注释
不要在注释里解释代码是如何运作的: 应该让别人一看你的代码就知道做了什么,而不是怎么做的.
注释应放在函数头部, 函数内部只在必要提示/警告的时候使用注释, 否则尽量不要注释.
使用/* */注释风格, 避免 // 风格.
大括号
Code Block 放在行尾
Function 放在下行行首
空格
1) 除了sizeof, typeof, alignof 或者__attribute__这些关键字, 剩下的关键字后都要加一个空格.
Example:
if, switch, case, for, do, while
if (condition) {
do_this();
}
s = sizeof(struct file)
2) 二元和三元操作符两侧使用空格, 一元操作符后不加空格
3) 不要在行尾留空白
4) * 靠近变量名或者函数名,而不靠近类型名.
Example:
char *linux_banner;
unsigned long long memparse(char *ptr, char **retptr);
char *match_strdup(substring_t *s);
变量命名
总之要具有描述性和简朴性, 具体我比较赞同Google Cpp Style中的命名方式.
typedef
尽量不要用typedef.
对结构体和指针使用 typedef 是一个错误: (X) typedef unsigned long myflags_t;
如果在某种情况下变数可能会是一个"unsigned int"而在其他情况下为"unsigned long",那么请务必使用 typedef.
宏
宏的名字需要大写
含有多个语句的宏应该被包含在一个 do-while 代码块里(do-while 语句可以避免定义多语句宏时产生错误):
#define macrofun(a, b, c) \
do { \
if (a == 5) \
do_this(b, c); \
} while (0)
使用宏的时候应避免的事情:
1) 影响控制流程的宏:
#define FOO(x) \
do { \
if (blah(x) < 0) \
return -EBUGGERED; \
} while(0)
这里 return 打乱了读者大脑里原文中的控制流程.
2) 表达式定义常量的宏必须将表达式置于一对小括号之内
#define CONSTANT 0x4000
#define CONSTEXP (CONSTANT | 3)
函数
名字应具有描述性.
内容应简短, 且只完成一件事情.
函数越复杂, 缩进越多, 函数体长度应该越短.
本地变量(函数内的局部变量)数量不应超过 5-10 个
函数返回值
如果函数名是一个动作(action)或者强制性的命令,那么这个函数应该返回错误代码整数。
如果是一个判断,那么函数应该返回一个"成功"布尔值.
返回值是实际计算结果而不是计算是否成功的标志的函数不受此惯例的限制
内联函数
如果一个函数有 3 行以上,就不要把它变成内联函数
goto
当一个函数从多个位置退出并且需要做一些通用的清洁工作的时候, 可以使用goto.
理由是:
- 嵌套程度减小
- 无条件语句容易理解和跟踪
- 可以避免由于修改时忘记更新某个单独的退出点而导致的错误
- 减轻了编译器的工作,无需删除冗余代码;)
Example:
int fun(int a)
{
int result = 0;
char *buffer = kmalloc(SIZE);
if (buffer == NULL)
return -ENOMEM;
if (condition1) {
while (loop1) {
...
}
result = 1;
goto out;
}
...
out:
kfree(buffer);
return result;
}
注: 本篇为 Linus Linux Kernel Coding Style 中译版读后笔记.
附: Linus 原文地址: http://www.kernel.org/doc/Documentation/CodingStyle
阅读(393) | 评论(0) | 转发(0) |