成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

談談為 Linux 內(nèi)核寫驅(qū)動的編碼規(guī)范

開發(fā)
最近在向Linux內(nèi)核提交一些驅(qū)動程序,在提交的過程中,發(fā)現(xiàn)自己的代碼離Linux內(nèi)核 的coding style要求還是差很多。當初自己對內(nèi)核文檔里的CodingStyle一文只是粗略的瀏覽,真正寫代碼的時候在很多細節(jié)上會照顧不周。

最近在向Linux內(nèi)核提交一些驅(qū)動程序,在提交的過程中,發(fā)現(xiàn)自己的代碼離Linux內(nèi)核 的coding style要求還是差很多。當初自己對內(nèi)核文檔里的CodingStyle一文只是粗略的瀏覽,真正寫代碼的時候在很多細節(jié)上會照顧不周。不過, 在不遵 守規(guī)則的程序員隊伍里,我并不是孤獨的。如果去看drivers/staging下的代碼,就會發(fā)現(xiàn)很多驅(qū)動程序都沒有嚴格遵守內(nèi)核的coding style,而且在很多驅(qū)動程序的TODO文件里,都會把"checkpatch.pl fixes"作為自己的目標之一(checkpatch.pl是用來檢查代碼是否符合coding style的腳本)。

不可否認,coding style是仁者見仁、智者見智的事情。比如Microsoft所推崇的匈牙利命名法,在Linus看來就是及其腦殘(brain damaged)的做法。也許您并不贊成Linus制定的coding style,但在提交內(nèi)核驅(qū)動這件事上,***還是以大局為重。對于這么一個龐大的集市式的開發(fā)來說,隨意書寫代碼必將帶來嚴重的可維護性的災難。

[[143208]]

(題圖來自:mota.ru)

一些輔助工具

當代碼量達到一定程度時,手動去檢查和修改coding style是非常繁瑣的工作,幸好,我們還有一些工具可以使用。

scripts/checkpatch.pl

這是一個檢查代碼是否符合內(nèi)核編碼規(guī)范的的腳本。顧名思義,checkpatch是用來檢查patch的,默認的調(diào)用也確實如此。如果用來檢查原文件,需要加上“-f”的選項。

我們來看一段無聊的代碼(文件名為print_msg.c):

  1. void print_msg(int a)

  2. {

  3. switch (a) {

  4. case 1:

  5. printf("a == 1\n");

  6. break;

  7. case 2:

  8. printf("a == 2\n");

  9. break;

  10. }

  11. }

這段代碼的coding style是否有問題呢?用checkpatch.pl來檢查一下:

  1. scripts/checkpatch.pl -f  print_msg.c

檢查的結果是:

  1. ERROR: switch and case should be at the same indent

  2. #3: FILE: switch.c:3:

  3. + switch (a) {

  4. + case 1:

  5. [...]

  6. + case 2:

  7. total: 1 errors, 0 warnings, 12 lines checked

  8. switch.c has style problems, please review. If any of these errors

  9. are false positives report them to the maintainer, see

  10. CHECKPATCH in MAINTAINERS.

在Linux內(nèi)核的coding style里,switch和case要求有相同的縮進。本例的代碼很少,錯誤也只有這一個,手動修改很方便。如果類似的縮緊錯誤很多怎么辦?

scripts/Lindent

scripts目錄下的工具Lindent可以用來自動修改縮進問題。提醒一下,使用Lindent要求系統(tǒng)安裝indent這個工具。

對于上面這個例子,執(zhí)行Lindent命令:

  1. scripts/Lindent print_msg.c

得到的新代碼是:

  1. void print_msg(int a)

  2. {

  3. switch (a) {

  4. case 1:

  5. printf("a == 1\n");

  6. break;

  7. case 2:

  8. printf("a == 2\n");

  9. break;

  10. }

  11. }

sed

sed是一個流編輯器,其強大的功能可以幫助我們處理很多重復性的工作。比如,Linux內(nèi)核的coding style要求,行尾不能有空格(包括Tab),去除這些空格就可以借助sed。

我自己的習慣很差,經(jīng)常在代碼的行尾留下一些空格。比如一行代碼過長需要換行時,總是下意識的在換行的地方敲一個空格。另外,我常用的編輯器之一的Kate,為了對齊的需要,經(jīng)常在空行的前面留上幾個縮進的Tab(如下圖)。

[[143209]] 

手動去除這些行尾的空格是一件頭大的事情,但對于sed來說不過是舉手之勞。命令格式如下:

  1. sed 's/[ \t]*$//g' your_code.c

一些需要注意的代碼風格

縮進

1、除了注釋、文檔和Kconfig之外,使用Tab縮進,而不是空格,并且Tab的寬度為8個字符;

2、switch ... case ...語句中,switch和case具有相同的縮進(參考上文);

花括號

3、花括號的使用參考K&R風格。

如果是函數(shù),左花括號另起一行:

  1. int function(int x)

  2. {

  3. body of function

  4. }

否則,花括號緊接在語句的***:

  1. if (x is true) {

  2. we do y

  3. }

如果只有一行語句,則不需要用花括號:

  1. if (condition)

  2. action();

但是,對于條件語句來說,如果一個分支是一行語句,另一個分支是多行,則需要保持一致,使用花括號:

  1. if (condition) {

  2. do_this();

  3. do_that();

  4. } else {

  5. otherwise();

  6. }

空格

4、在關鍵字“if, switch, case, for, do, while”之后需要加上空格,如:

  1. if (something)

5、在關鍵字“sizeof, typeof, alignof, or __attribute__”之后不要加空格,如:

  1. sizeof(struct file)

6、在括號里的表達式兩邊不要加空格,比如,下面是一個反面的例子

  1. sizeof( struct file )

7、大多說的二元和三元運算符兩邊需要空格,如“= + - < > * / % | & ^ <= >= == != ? :”;

8、一元運算符后面不要空格,如“& * + - ~ ! sizeof typeof alignof __attribute__ defined”;

9、在前綴自增自減運算符之后和后綴自增自減運算符之前不需要空格(“++”和“--”);

10、結構成員運算符(“.”和“->”)的兩邊不需要空格;

11、行尾不需要空格;

注釋

12、使用C89的“/* ... */”風格而不是C99的“// ...”風格;

13、對于多行注釋,可以參考下例:

  1. /*

  2. * This is the preferred style for multi-line

  3. * comments in the Linux kernel source code.

  4. * Please use it consistently.

  5. *

  6. * Description: A column of asterisks on the left side,

  7. * with beginning and ending almost-blank lines.

  8. */

Kconfig

14、“config”定義下面的語句用Tab縮進,help下面的語句再額外縮進兩個空格,如:

  1. config AUDIT

  2. bool "Auditing support"

  3. depends on NET

  4. help

  5. Enable auditing infrastructure that can be used with another

  6. kernel subsystem, such as SELinux (which requires this for

  7. logging of avc messages output). Does not do system-call

  8. auditing without CONFIG_AUDITSYSCALL.

15、多行的宏定義需要用“do .. while”封裝,如:

  1. #define macrofun(a, b, c) \

  2. do { \

  3. if (a == 5) \

  4. do_this(b, c); \

  5. } while (0)

函數(shù)返回值

16、函數(shù)返回值的定義***也要遵循一定的章法。

如果函數(shù)的名稱是一種動作或者命令式的語句,應該以錯誤代碼的形式返回(通常是0表示成功,-Exxx這種形式的負數(shù)表示錯誤),如:

  1. do_something()

如果函數(shù)的名稱是判斷語句,則返回值應該類似與布爾值(通常1表示成功,0表示錯誤),如:

  1. something_is_present()


【參考資料】

(1) Documentation/CodingStyle

(2) http://www.kroah.com/linux/talks/ols_2002_kernel_codingstyle_talk/html/

來源:http://www.cnblogs.com/wwang/archive/2011/02/24/1960283.html

 

 

 

責任編輯:王雪燕 來源: wwang's blog
相關推薦

2015-07-30 10:51:42

Linux內(nèi)核Linux

2015-07-20 10:00:28

Linux內(nèi)核編碼風格

2017-03-23 14:30:13

Linux內(nèi)核驅(qū)動編碼風格

2023-05-15 08:58:41

塊設備驅(qū)動Linux

2015-08-03 10:43:58

Linux內(nèi)核驅(qū)動

2015-03-18 09:34:47

程序員編碼規(guī)范

2013-10-31 16:29:10

Linux內(nèi)核

2023-05-12 07:27:24

Linux內(nèi)核網(wǎng)絡設備驅(qū)動

2017-08-01 17:34:47

Linux內(nèi)核驅(qū)動文件讀寫

2023-04-28 08:42:08

Linux內(nèi)核SPI驅(qū)動

2022-10-08 11:57:30

Linux內(nèi)核架構

2021-12-15 10:02:25

鴻蒙HarmonyOS應用

2020-11-11 11:11:23

Linux內(nèi)核源碼

2011-08-16 16:20:33

Linuxkconfigmakefile

2013-04-08 10:33:54

編碼編碼規(guī)范

2023-07-05 15:44:15

數(shù)據(jù)驅(qū)動數(shù)字化轉(zhuǎn)型

2019-07-19 09:05:39

前后分離接口

2020-11-05 10:20:54

前端編碼規(guī)范安全漏洞

2017-08-28 15:30:49

Android編碼器編碼

2010-07-19 10:05:52

ibmdwLinux
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人日韩av| 91亚洲精品国偷拍自产在线观看 | 日韩福利在线观看 | 草久久 | 在线亚洲电影 | 亚洲精品美女视频 | 国产一区三区在线 | 最新中文字幕在线 | 成人深夜福利网站 | 99小视频 | 国产精品海角社区在线观看 | 亚洲欧美精品国产一级在线 | 亚洲毛片在线 | 亚洲精品区 | 亚洲专区在线 | 精品av天堂毛片久久久借种 | 欧美精品福利 | 99国产欧美| 又黑又粗又长的欧美一区 | 国产视频一区在线观看 | 成人做爰9片免费看网站 | 久久精品一区二区视频 | 国产精品美女在线观看 | 日本不卡一区二区三区在线观看 | 这里只有精品99re | 伊人网国产 | 国产精品.xx视频.xxtv | 国产精品久久久久久久久免费樱桃 | 99爱视频 | 欧美日本韩国一区二区 | 青青草av在线播放 | 精精国产xxxx视频在线野外 | 久久久91精品国产一区二区三区 | 91精品国产欧美一区二区 | 免费观看av | 999精品网 | 成人精品视频免费 | 欧美日韩国产免费 | 国产精品永久免费观看 | 超碰97人人人人人蜜桃 | 91av视频 |