国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

查看: 6606|回復(fù): 0
打印 上一主題 下一主題

談?wù)劄?Linux 內(nèi)核寫(xiě)驅(qū)動(dòng)的編碼規(guī)范

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2017-5-25 09:23:03 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
關(guān)鍵詞: Linux , 內(nèi)核 , 編碼

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


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


一些輔助工具


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


scripts/checkpatch.pl


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


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

void print_msg(int a)
{
switch (a) {
case 1:
printf("a == 1\n");
break;

case 2:
printf("a == 2\n");
break;
}
}


這段代碼的coding style是否有問(wèn)題呢?用checkpatch.pl來(lái)檢查一下:

scripts/checkpatch.pl -f print_msg.c

檢查的結(jié)果是:

ERROR: switch and case should be at the same indent
#3: FILE: switch.c:3:
+ switch (a) {
+ case 1:
[...]
+ case 2:

total: 1 errors, 0 warnings, 12 lines checked

switch.c has style problems, please review. If any of these errors
are false positives report them to the maintainer, see


CHECKPATCH in MAINTAINERS.

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


scripts/Lindent


scripts目錄下的工具Lindent可以用來(lái)自動(dòng)修改縮進(jìn)問(wèn)題。提醒一下,使用Lindent要求系統(tǒng)安裝indent這個(gè)工具。

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


scripts/Lindent print_msg.c


得到的新代碼是:


void print_msg(int a)
{
switch (a) {
case 1:
printf("a == 1\n");
break;

case 2:
printf("a == 2\n");
break;
}
}


sed


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


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


手動(dòng)去除這些行尾的空格是一件頭大的事情,但對(duì)于sed來(lái)說(shuō)不過(guò)是舉手之勞。命令格式如下:


sed ‘s/[ \t]*$//g’ your_code.c

一些需要注意的Coding Style


縮進(jìn)


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


2、switch … case …語(yǔ)句中,switch和case具有相同的縮進(jìn)(參考上文);


花括號(hào)


3、花括號(hào)的使用參考K&R風(fēng)格。

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

int function(int x)
{
body of function
}

否則,花括號(hào)緊接在語(yǔ)句的最后:

if (x is true) {
we do y
}

如果只有一行語(yǔ)句,則不需要用花括號(hào):

if (condition)
action();

但是,對(duì)于條件語(yǔ)句來(lái)說(shuō),如果一個(gè)分支是一行語(yǔ)句,另一個(gè)分支是多行,則需要保持一致,使用花括號(hào):

if (condition) {
do_this();
do_that();
} else {
otherwise();
}


空格


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

if (something)


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

sizeof(struct file)


6、在括號(hào)里的表達(dá)式兩邊不要加空格,比如,下面是一個(gè)反面的例子:

sizeof( struct file )


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


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


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


10、結(jié)構(gòu)成員運(yùn)算符(“.”和“->”)的兩邊不需要空格;


11、行尾不需要空格;


注釋


12、使用C89的“/* … */”風(fēng)格而不是C99的“// …”風(fēng)格;


13、對(duì)于多行注釋?zhuān)梢詤⒖枷吕?/font>

/*
* 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.
*/


Kconfig


14、“config”定義下面的語(yǔ)句用Tab縮進(jìn),help下面的語(yǔ)句再額外縮進(jìn)兩個(gè)空格,如:

config AUDIT
bool "Auditing support"
depends on NET
help
Enable auditing infrastructure that can be used with another
kernel subsystem, such as SELinux (which requires this for
logging of avc messages output). Does not do system-call
auditing without CONFIG_AUDITSYSCALL.


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

#define macrofun(a, b, c) \
do { \
if (a == 5) \
do_this(b, c); \
} while (0)


函數(shù)返回值


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

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

do_something()

如果函數(shù)的名稱(chēng)是判斷語(yǔ)句,則返回值應(yīng)該類(lèi)似與布爾值(通常1表示成功,0表示錯(cuò)誤),如:

something_is_present()


想要了解嵌入式、物聯(lián)網(wǎng)相關(guān)技術(shù)的可以聯(lián)系宋工企鵝號(hào)三五二四六五九零八八
Tel:173--1795--1908
免費(fèi)試聽(tīng)C語(yǔ)言、電子、PCBSTM32、Linux、FPGA、JAVA、安卓等。
想學(xué)習(xí)的你和我聯(lián)系預(yù)約就可以免費(fèi)聽(tīng)課了。



本版積分規(guī)則

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 怡红院在线视频观看| 无国产精品白浆是免费| 一级毛片片| 日韩欧美一级| 热久久网站| 亚洲国产精品免费观看| 亚洲免费在线观看视频| 国产3级在线观看| 婷婷四房播客五月天| 天堂在线观看中文字幕| 色综合久久中文综合网| 色婷婷天天综合在线| 自拍亚洲国产| 国产综合在线视频| 首页_亚洲AV色老汉影院| 天天碰免费上传视频| 日本在线观看免费| 一级做a爰性色毛片免费| 一二三四视频6在线观看| 国拍在线精品视频免费观看| 亚洲人成电影网站| 日本在线视频二区| 天天影视综合色区| 亚洲乱码尤物193yw最新网站| vidosgratis tv少女| 人人看人人看| 一本到亚洲网| 天天干天天草天天| 午夜a一级毛片| 宫交拔不出来了h黑人| 亚洲成熟人网站| 五月综合久久| 视频免费1区二区三区| 四虎最新网址入口| 337p啪啪人体大胆| 两个奶被男人揉了一个晚上| 一本道亚洲区免费观看| 一级床片45分钟的视频| 亚洲国产成人久久77| 伊人青青视频| 欧美精品华人在线|