一、缩进
- 语句行首最好是8个字符的缩进
switch (suffix) {
case 'G':
case 'g':
mem <<= 30;
break;
case 'M':
case 'm':
mem <<= 20;
break;
case 'K':
case 'k':
mem <<= 10;
fallthrough;
default:
break;
}
二、换行
- 一行只有一条语句,错误示范如下:
if (condition) do_this;
- 长度超过80另起一行,但不要折断字符串
三、花括号
- 非函数语句,左花括号放在最后,且与前面空一格
if (x is true) {
we do y
}
- 函数语句,左花括号另起一行
int function(int x)
{
body of function
}
- do-while语句
do {
body of do-loop
} while (condition);
- if-else语句
if (x == y) {
..
} else if (x > y) {
...
} else {
....
}
- 单条语句不需要使用花括号
if (condition)
do_this();
else
do_that();
while (condition) {
if (test)
do_something();
}
四、空格
- 关键字if, switch, case, for, do, while后面接空格
if (condition)
action();
- sizeof, typeof, alignof等关键字后面不需要接空格
s = sizeof(struct file);
- 括号内两边不需要加空格,错误示范如下:
s = sizeof( struct file );
- 指针符号要挨着数据名
char *linux_banner;
unsigned long long memparse(char *ptr, char **retptr);
char *match_strdup(substring_t *s);
- 二元或三元运算符= + - < > * / % | & ^ <= >= == != ? :两边要加空格
s = a + b;
- 一元运算符& * + - ~ !不用加空格
*b = &a;
- 递增++和递减–不需要加空格
a++;
- 结构体相关.和->不用加空格
file.open();
五、命名
- 尽量避免混合大小写,变量名要求简洁明了,如临时变量定义:
int tmp;
- 全局变量或函数可以使用比较详细的描述性的名称
count_active_users();
- 局部变量尽量简短,计数变量的定义:
int i;
六、类型定义
- 尽量避免使用typedef定义结构体或结构体指针,如下面的vps_t,让人完全看不出来a是个什么类型的变量
vps_t a;
- 使用如下方式来声明结构体或结构体指针,清晰明了
struct virtual_container *a;
- 对外不透明的结构体或结构体指针类型可以用typedef来定义,如定义一个pte_t类型,你不需要了解它的具体内容
- 一些整形数据可以用typedef加以区分,如u8、u16、u32分别被定义成不同长度的整型数据
七、函数
- 一个函数的局部变量尽量不要超过5-10个,否则就该思考如何将其分解成更小的部分
- 函数与函数之间隔一行
- 导出函数紧随函数其后
int system_is_up(void)
{
return system_state == SYSTEM_RUNNING;
}
EXPORT_SYMBOL(system_is_up);
- 在函数原型中,写全参数名及其数据类型
八、注释
- 注释一般放在函数的前面,描述函数的功能,风格如下:
/*
* This is the preferred style for multi-line
* comments in the Linux kernel source code.
* Please use it consistently.
*
* Description: A column of asterisks on the left side,
* with beginning and ending almost-blank lines.
*/
九、宏定义
- 宏定义常量一般为大写
#define CONSTANT 0x12345
- 宏定义函数可以用小写,包含多条语句时,写在do-while块中
#define macrofun(a, b, c) \
do { \
if (a == 5) \
do_this(b, c); \
} while (0)
- 不要在宏定义中使用return语句,错误示范:
#define FOO(x) \
do { \
if (blah(x) < 0) \
return -EBUGGERED; \
} while (0)
- 宏定义不能依赖本地变量,错误示范:
#define FOO(val) bar(index, val)
- 宏定义要使用括号以确定优先级
#define CONSTANT 0x4000
#define CONSTEXP (CONSTANT | 3)
十、返回值
- 如果函数名是一个动作或命令,则执行成功返回0,否则返回其他;如果函数名是询问,则执行成功返回1,否则返回0
十一、条件编译
- 在#endif后面给上注释
#ifdef CONFIG_SOMETHING
...
#endif /* CONFIG_SOMETHING */
参考资料:https://www.kernel.org/doc/Documentation/process/coding-style.rst