如何理解Linux内核驱动的编码风格


本篇文章给大家分享的是有关如何理解Linux内核驱动的编码风格,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。最近在向Linux内核提交一些驱动程序,在提交的过程中,发现自己的代码离Linux内核的coding style要求还是差很多。当初自己对内核文档里的CodingStyle一文只是粗略的浏览,真正写代码的时候在很多细节上会照顾不周。不过, 在不遵守规则的程序员队 伍里,我并不是孤独的。如果去看drivers/staging下的代码,就会发现很多驱动程序都没有严格遵守内核的coding style,而且在很多驱动程序的TODO文件里,都会把”checkpatch.pl fixes”作为自己的目标之一(checkpatch.pl是用来检查代码是否符合coding style的脚本)。不可否认,coding style是仁者见仁、智者见智的事情。比如Microsoft所推崇的匈牙利命名法,在Linus看来就是及其脑残(brain damaged)的做法。也许您并不赞成Linus制定的coding style,但在提交内核驱动这件事上,***还是以大局为重。对于这么一个庞大的集市式的开发来说,随意书写代码必将开发云主机域名带来严重的可维护性的灾难。一些辅助工具当代码量达到一定程度时,手动去检查和修改coding style是非常繁琐的工作,幸好,我们还有一些工具可以使用。scripts/checkpatch.pl这是一个检查代码是否符合内核编码规范的的脚本。顾名思义,checkpatch是用来检查patch的,默认的调用也确实如此。如果用来检查原文件,需要加上“-f”的选项。我们来看一段无聊的代码(文件名为print_msg.c):这段代码的coding style是否有问题呢?用checkpatch.pl来检查一下:scripts/checkpatch.pl -f print_msg.c检查的结果是:在Linux内核的coding style里,switch和case要求有相同的缩进。本例的代码很少,错误也只有这一个,手动修改很方便。如果类似的缩紧错误很多怎么办?scripts/Lindentscripts目录下的工具Lindent可以用来自动修改缩进问题。提醒一下,使用Lindent要求系统安装indent这个工具。对于上面这个例子,执行Lindent命令:scripts/Lindent print_msg.c得到的新代码是:sedsed是一个流编辑器,其强大的功能可以帮助我们处理很多重复性的工作。比如,Linux内核的coding style要求,行尾不能有空格(包括Tab),去除这些空格就可以借助sed。我自己的习惯很差,经常在代码的行尾留下一些空格。比如一行代码过长需要换行时,总是下意识的在换行的地方敲一个空格。另外,我常用的编辑器之一的Kate,为了对齐的需要,经常在空行的前面留上几个缩进的Tab(如下图)。手动去除这些行尾的空格是一件头大的事情,但对于sed来说不过是举手之劳。命令格式如下:一些需要注意的Coding Style缩进1、除了注释、文档和Kconfig之外,使用Tab缩进,而不是空格,并且Tab的宽度为8个字符;2、switch … case …语句中,switch和case具有相同的缩进(参考上文);花括号3、花括号的使用参考K&R风格。如果是函数,左花括号另起一行:否则,花括号紧接在语句的***:如果只有一行语句,则不需要用花括号:但是,对于条件语句来说,如果一个分支是一行语句,另一个分支是多行,则需要保持一致,使用花括号:空格4、在关键字“if, switch, case, for, do, while”之后需要加上空格,如:if (something)5、在关键字“sizeof, typeof, alignof, or __attribute__”之后不要加空格,如:sizeof(struct file)6、在括号里的表达式两边不要加空格,比如,下面是一个反面的例子:sizeof( struct file )7、大多说的二元和三元运算符两边需要空格,如“= + – * / % | & ^ = == != ? :”;8、一元运算符后面不要空格,如“& * + – ~ ! sizeof typeof alignof __attribute__ defined”;9、在前缀自增自减运算符之后和后缀自增自减运算符之前不需要空格(“++”和“–”);10、结构成员运算符(“.”和“->”)的两边不需要空格;11、行尾不需要空格;注释12、使用C89的“/* … */”风格而不是C99的“// …”风格;13、对于多行注释,可以参考下例:Kconfig14、“config”定义下面的语句用Tab缩进,help下面的语句再额外缩进两个空格,如:15、多行的宏定义需要用“do .. while”封装,如:函数返回值16、函数返回值的定义***也要遵循一定的章法。如果函数的名称是一种动作或者命令式的语句,应该以错误代码的形式返回(通常是0表示成功,-Exxx这种形式的负数表示错误),如:do_something()如果函数的名称是判断语句,则返回值应该类似与布尔值(通常1表示成功,0表示错误),如:something_is_present()以上就是如何理解Linux内核驱动的编码风格,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注开发云行业资讯频道。

相关推荐: 如何进行Active Directory 备份

这篇文章给大家分享的是有关如何进行Active Directory 备份的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。备份至网络共享备份至网络共享就象备份至本地卷一样轻松。两者的主要差异是,它不能创建远程卷的“卷影复制服务”快照。因…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 05/05 11:49
下一篇 05/05 11:49