这是一篇简略的文章,描述了描述了linux内核的首选代码风格。目的是为了分享,作为一名linux内核或则驱动开发工程师,很有必要了解这种内核开发规范。
linux内核代码规范约定如下:
1.强烈推荐单行的长度为八十列。
任何一行超过八十列长度的句子都应当拆分成多个行,除非超过八十列的部份可以增强可读性且不会隐藏信息。并且,千万不要把用户可见的字符串,例如printk的信息,拆分成多行,由于这样会造成使用grep的时侯找不到这种信息。
2.关于大括弧
c语言里的if,do,while,for句子就会使用到大括弧,内核代码倾向于把左括弧置于行末,把右括弧置于行首,但是大括弧和上面的句子,以及if和旁边的句子,都保留一个空格,比如:
以上红圈标明都代表一个空格。
3.关于空格
这个还是单独列下来说明一下吧,由于内核代码里用到空格的地方太多了。
Linux内核风格的空格主要用在一些关键字上,即在关键字然后添一个空格。值得关注的例外是一些长得像函数的关键字,例如:sizeof,typeof,alignof,attribute,在Linux中,那些关键字的使用还会带上一对括弧,例如sizeof(int)。
所以在下边那些关键字前面须要添加一个空格:
if,switch,case,for,do,while
然而,sizeof,typeof,alignof,attribute以后则不须要添加空格:
s=sizeof(structfile);
在申明表针或则返回值为表针的函数时qq for linux,星号的位置应当毗邻着变量名或函数名,而不是类型名,比如:
charlinux_banner;unsignedlonglongmemparse(charptr,char*retptr);charmatch_strdup(substring_t*s);
在二元操作符和三元操作符周围添加一个空格,比如:
=+-*/%|&^===!=?:
并且不要在一元操作符然后添加空格:
&*+-~!sizeoftypeofalignofattributedefined
4.变量命名
C是一种简约粗旷的语言,因而,你的命名也应当是简约的。linux内核里的变量定义应当尽可能简单,在不形成歧义的情况下,越简单越好。可以用顿号,而且绝对不推荐使用小写字母。所以,内核里的变量和函数定义不要使用驼峰命名法。
5.函数
函数应当短小精悍,一个函数只干一件事。几百行代码组成一个函数是不被推荐的。
关键函数的上面最好留有注释。这样其他人可以快速读懂你的代码意图:
6.注释
多行注释推荐格式如下:
/*
7.推荐使用函数自注释
所谓函数自注释,就是从你的函数名就可以猜到你要干哪些,例如内核的:
wait_event(),wait_event_interruptible(),wait_event_interruptible_timeout()等。
注意,写代码不只是献给如今的自己,也是献给之后的自己,也是献给其他人看的。假如你回看你一年前写的代码都很陌生,那说明你的代码规范是有问题的。
8.常量宏和枚举的命名都是小写的:
9.复印内核或则驱动信息
编撰好的调试信息是一项巨大的挑战,一旦你完成了,这种信息会对远程调试形成巨大帮助
好多子系统在对应的makefile里都有Kconfig调试选项来打开-DDEBUG,或则是在文件里定义宏#defineDEBUG。当调试信息可以被无条件复印linux 内核之 分析有源代码,或则说早已编译了和调试有关的#ifdef段,这么printk(KERN_DEBUG...)就可以拿来复印调试信息。
10.内联函数(inline)
Inline关键字会让编译器将指定的函数体插入并代替每一处调用该函数的地方(上下文)linux 内核之 分析有源代码什么是linux,因而节约了每次调用函数带来的额外时间开销。但是,inline关键字的猖獗,会使内核变大,因而使整个系统运行速率变慢,由于大内核会占用更多的CPU高速缓存,同时会造成可用显存页缓存降低。想像一下,一次页缓存未命中都会造成一次c盘轮询,这起码花费5微秒。5微秒足够CPU运行好多好多的指令。
好了,以上就是我们在阅读linux内核源码的时侯的一些代码规范的约定。linux源码作为世界上最规范、最严谨的代码,确实有好多值得我们学习的地方。有时侯欣赏内核代码的时侯总有一种赏心悦目的觉得,这可能跟它们的良好的代码规范有关系吧。希望这个对你们有所帮助,之后对Linux感兴趣的朋友可以看一下教程
Linux教程:
Linux微课:
Linux就该如此学: