Linux内核编码风格

不一样的语言风格

当今世界上一共有5000多种语言。不同的国家、民族和地区,说着不同的语言。每个民族不一定有自己的文字,但一般都会有自己的语言。即使是同一种语言,在不同的时代、不同的地区和群体,说话的方式和语言风格也各不相同。同样是刘备《三顾茅庐》的故事,如果换成不同的人去说,你会发现说话方式和语言风格也各不相同:

TVB腔:呐,做人呢,最重要的是开心。玄德你饿不饿,我煮碗面给你吃。

日系风:玄德桑是怀着对天下美好的期盼来的吧,真是让人无法拒绝呢。

欧美翻译腔:噢!上帝!好家伙!你怎么来三次了!我对上帝发誓,我不是故意要你等的!

东北腔:艾玛!您来就来吧,您还来三次,这整滴啥玩意儿啊?快进来吧,都哆嗦了。

班主任腔:让你来三次,是为了你好!以后你就知道了!

知乎大V风:谢邀,人在南阳,刚下飞机。作为卧龙岗小透明,圈子小熟人多所以先匿了。一觉起来这么多赞,看到玄德兄又实名反对高赞答案,不知能否私信分享下:吃了三次闭门羹是一种怎样的体验?

如果换成郭敬明,话风可能又变成这样:在这无尽的寂寞里,时间化为了灰烬,大雪逆转了天地。而我在这里静静地等待,等待宿命之轮开启它的轮转。我知道你一定会再来,第三次,玄德,我会让你,自由地…

C语言的编程风格

C语言也是一种语言,同样满足语言的基本三要素:语音、词汇和语法。同样是C语言编程,不同的平台、项目、公司、社群,代码风格也是风格迥异,各不相同。

在Windows下编写一个C语言函数,我们通常喜欢使用下面的命名方式:

void OpenDoor(void);

而在Linux下编写一个C语言函数,我们通常喜欢使用下面的命名方式:

void open_door(void);

而同样是在Linux环境下,如果是一个GNU项目,函数的命名通常又变成了这样:

void
open_door (void);

不同的开发环境,不同的平台,不同的公司,不同的项目,编程规范和代码风格可能各不相同,我们需要遵守的原则其实也很简单:入乡随俗。

Linux内核编码风格

在Linux内核源码的Documentation/process/coding-style.rst文件里,详细讲述了Linux内核编程时需要遵循的一些编程规范。

1.代码的缩进使用tab键,建议是8个空格

大家在写代码缩进时要使用tab键,而不是直接敲4个或8个空格。tab键的缩进可以通过IDE的选项调节,也可以在vimvimrc配置文件中设置。使用tab键缩进8个空格,可以让代码的结构更加清晰,但带来的弊端是当程序嵌套的层次很深时,缩进会使每一行写代码的空间大大减少。为了预防这种情况发生,在Linux内核中switch-case语句中,case语句一般都是和switch顶格写。

2.空格


在Linux内核代码中,使用空格的地方主要分布如下

  • 在if、switch、case、for、do、while后,和(之间要加一个空格
  • 二元运算符:+、-、|、*、=、== 等两侧一般要加空格
  • 函数名、一元运算符++、—等后面一般不用加空格
  • 小括号里表达式的两侧一般不要加空格
  • sizeof、typeof、alignof、__attribute__后面一般不要加空格
3.换行


一般在if、switch、case、for、do、while后的大括号不能单独占一行,但函数的一对大括号都可以单独占一行。函数的参数一行写不下,可以换行写,各个函数之间一般也要空一行。

在if-else分支结构中,else分支和大括号一般不会单独占一行,而是和if分支的}在同一行。

格式化工具:indent

Linux提供了一个好用的工具:indent,可以对我们编写的C语言代码进行格式检查。比如我们下面的这

indent的使用和安装都很方便:

# apt install indent
# indent -linux -ce hello.c

indent默认的风格是GNU,如果你编写的程序代码很乱,没有留空格,没有换行,没有缩进,阅读性很差:


我们使用上面的indent命令对这段代码进行处理后,再次使用vim打开,你会发现代码风格变成了下面这个样子,一下子就变得整洁了不少:


在 indent -linux -ce main.c命令中,-linux参数表示按照Linux风格来格式化代码:空格、缩进按照内核的规范,大括号不单独占一行。 -ce参数表示else分支不单独占一行,如果你使用-nce参数,else分支则会单独占一行。如此之外,还有很多参数供我们参考,你可以通过indent —help或man indent命令来查看这些参数的详细使用说明。

如果你想有自己的编码风格,你可以将这些格式化参数保存在~/.indent.pro文件中。以后你每次使用indent xx.c格式化一个C文件时,indent就会根据这个配置文件中保存的参数来格式化xx.c文件。

Linux内核源码中的scripts/Lindent脚本,可以对Linux内核代码进行格式化设置。这个Lindent脚本内部其实也是调用indent命令来运行的。

小结

以上给大家介绍了Linux内核中的代码风格和格式化工具indent的使用。由于篇幅关系只介绍另一部分,更多的编码规范和细节可以去阅读内核源码中的Documentation/process/coding-style.rst文档。

驱动开发核心理论,Linux内核开发入门实战视频教程:《Linux内核编程》,具有一线芯片原厂开发经验的驱动工程师录制,详情点击:王利涛老师个人淘宝店:Linux内核编程