linux下的C语言编码风格

tech2022-12-16  98

一、缩进

语句行首最好是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

最新回复(0)