Linux Kernel Coding Style --- Linux内核代码规范
来源:互联网 发布:淘宝二楼是干什么的 编辑:程序博客网 时间:2024/05/22 07:51
本文主要参考和搬运于:
* Linux kernel coding style
* Linux 内核Coding Style整理
侵删致歉。
1. 缩进
缩进采用8个字符宽度的tab
switch和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;}
2. 行长度限制
- 代码行长度要在80个字符以内
3. 括号和空格的位置
括号
- 下列非函数关键字,左大括号”{“不用换行
if, switch, for, while, do
if (x is true) { we do y}
- 函数的左大括号”{“要换行
int function(int x){ body of function}
- 以下情况右大括号”}”不单独占一行
do { body of do-loop} while (condition);
if (x == y) { ..} else if (x > y) { ...} else { ....}
- 单行不需要使用大括号
if (condition) action();if (condition) do_this();else do_this();
空格
下列关键字后面使用一个空格
if, switch, case, for, do, while定义指针类型时,”*”紧靠变量名或函数名
char *linux_banner;unsigned long long memparse(char *ptr, char **retptr);char *match_strdup(substring_t *s);
下列二元和三元操作符左右各留一个空格
= + - < > * / % | & ^ <= >= == != ? :下列一元,自加减,结构体成员的操作符不留空格
& * + - ~ ! sizeof typeof alignof _attribute_ defined
++ –
. ->不要在行尾留有空格,Git会警告行尾含有空格的patch
4. 命名
全局变量要有描述性的名字
例如活跃用户统计函数应该命名为count_active_users()而不是cntuser()局部变量命名要简短
例如循环计数变量应该命名为i而不是loop_counter
5. Typedefs
除了以下用途外,不要使用typedef:
完全不透明的类型
避免整型数据的困扰
使用kernel的sparse工具做变量类型检查
定义C99标准中的新类型
为了用户空间的类型安全
6. 函数
函数要简短,一个函数只做一件事
函数内部局部变量不要超过5 ~ 10个,否则你需要把函数切割成更小的函数
源码中的函数用一个空行分隔
7. 集中函数的退出
- 使用goto集中函数的退出
goto的标签名可以设置为out_free_buffer,避免使用err1:和err2:的标签名
int fun(int a){ int result = 0; char *buffer; buffer = kmalloc(SIZE, GFP_KERNEL); if (!buffer) return -ENOMEM; if (condition1) { while (loop1) { ... } result = 1; goto out_free_buffer; } ...out_free_buffer: kfree(buffer); return result;}
8. 注释
不要注释怎么做,而是注释做了什么
注释风格:
/* * 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. */
11. 数据结构
结构体要包含一个引用计数字段 (内核中没有自动垃圾收集, 需要手动释放内存)
需要保证结构体数据一致性时要加锁
结构体中有时甚至会需要多层的引用计数
ex. struc mm_struct, struct super_block
12. 宏,枚举和RTL
- 宏定义常量使用大写
#difine CONSTANT 0x123456
- 宏定义多行语句要放入do - while中
#define macrofun(a, b, c) \do { \ if (a == 5) \ do_this(b, c); \} while (0)
- 宏定义表达式时要放在()中
#define CONSTANT 0x4000#define CONSTEXP (CONSTANT | 3)
- 使用宏定义时要避免下列情况:
1) 影响控制流,如在宏定义中return
#define FOO(x) \do { \ if (blah(x) < 0) \ return -EBUGGERED; \} while (0)
2) 宏定义中含有局部变量
#define FOO(val) bar(index, val)
13. 打印内核消息
消息要简洁清晰明确
在
<linux/device.h\>
,<linux/printk.h\>
里面有打印消息的宏
关联设备或驱动<linux/device.h>
: dev_err(), dev_warn(), dev_info()等
不关联设备或驱动<linux/printk.h>
: pr_notice() pr_info(), pr_warn(), prerr()等
14. 分配内存
- 分配内存时使用sizeof(指针), 而不是sizeof(结构体)
p = kmalloc(sizeof(*p), ...);
- Linux Kernel Coding Style --- Linux内核代码规范
- Linux kernel coding style 内核代码风格
- Linux 内核代码风格--Kernel Coding Style(持续更新-20170616)
- LINUX KERNEL CODING STYLE
- Linux kernel coding style
- Linux kernel coding style
- Linux Kernel Coding Style
- Linux kernel coding style
- Linux kernel coding style
- Linux kernel coding style
- Linux kernel coding style
- Linux kernel coding style
- Linux kernel coding style
- Linux kernel coding style (Linux内核编码风格)
- Linux内核编码风格 Linux kernel coding style
- Linux 内核Coding Style整理
- coding style for the linux kernel
- coding style for the linux kernel
- Python中UDP协议的理解
- 微信小程序 scroll-view横向滚动 坑
- Android的JNI【实战教程】4⃣️--C调用Java代码
- JavaEE框架Mybatis中调用mysql的函数
- SSL与TLS的区别以及介绍
- Linux Kernel Coding Style --- Linux内核代码规范
- 连通图和连通分量
- Spring之jdbc数据库操作
- 类文件结构
- java 数组中两数之差的最大值 蛮力算法 动态规划及其优化
- JAVA的初学(数据类型,选择结构,循环)
- Runtime descriptor "/WEB-INF/sun-jaxws.xml" is mising
- 微信小程序简单的登录页面的跳转
- poi/jxls导入/导出Excel工具类(支持2003和2007)