代碼編程規(guī)范-排版風(fēng)格
掃描二維碼
隨時(shí)隨地手機(jī)看文章
前言
這篇重點(diǎn)介紹一下代碼編程的排版風(fēng)格和自動(dòng)排版工具
代碼規(guī)范化中的排版基本上有七大風(fēng)格,主要體現(xiàn)在縮進(jìn)、空行、代碼行、空格、成對(duì)書寫、對(duì)齊、注釋七方面的書寫規(guī)范上。
規(guī)范要求
縮進(jìn)
程序塊采用縮進(jìn)風(fēng)格編寫,縮進(jìn)可以使程序更有層次感,每次縮進(jìn)一般為 4 個(gè)空格(部分要求為一個(gè)制表符Tab;我個(gè)人喜歡用空格,因?yàn)橹票矸煌庉嬈骺s進(jìn)不同,雖然能設(shè)置,但是麻煩)
原則是:如果地位相等,則不需要縮進(jìn);如果屬于某一個(gè)代碼的內(nèi)部代碼就需要縮進(jìn)
空行
空行起著分隔程序段落的作用??招械皿w將使程序的布局更加清晰??招胁粫?huì)浪費(fèi)內(nèi)存,雖然在文檔中比較多,但是值得
定義變量后要空行。盡可能在定義變量的同時(shí)初始化該變量,即遵循就近原則;如果變量的引用和定義相隔比較遠(yuǎn),那么變量的初始化就很容易被忘記。若引用了未被初始化的變量,就會(huì)導(dǎo)致程序出錯(cuò)
每個(gè)函數(shù)定義結(jié)束之后都要加空行
結(jié)合1、2兩點(diǎn)綜合來(lái)說(shuō),相對(duì)獨(dú)立的程序塊之間、變量說(shuō)明之后必須加空行。比如上面幾行代碼完成的是一個(gè)功能,下面幾行代碼完成的是另一個(gè)功能,那么它們中間就要加空行。這樣看起來(lái)更清晰
1isFoo = true; 2// 空行 3if (isFoo) 4{ 5 bar(); 6} 7else 8{ 9 anotherBar(); 10} 11// 空行 12isBar = false;
代碼行
-
一行代碼只做一件事情,如只定義一個(gè)變量,或只寫一條語(yǔ)句。這樣的代碼容易閱讀,并且便于寫注釋
-
if、for、do、while、case、switch、default等語(yǔ)句獨(dú)占一行,執(zhí)行語(yǔ)句不得緊跟其后
不論執(zhí)行語(yǔ)句有多少行,就算只有一行也要加{},并且遵循對(duì)齊的原則,這樣可以防止書寫失誤
-
一條語(yǔ)句不能過(guò)長(zhǎng),如不能拆分需要分行寫,對(duì)于目前大多數(shù)的PC來(lái)說(shuō),132 比較合適(80/132是VTY常見的行寬值)
對(duì)于新PC寬屏顯示器較多的產(chǎn)品來(lái)說(shuō),可以設(shè)置更大的值; 且目前的軟件大多都能設(shè)置并顯示這個(gè)寬度的提示線
1// 錯(cuò)誤示范 2if (...){...} 3 4// 正確示范 5if (...) 6{ 7 ... 8}
空格
-
關(guān)鍵字之后要留空格。像const、case等關(guān)鍵字之后至少要留一個(gè)空格,否則無(wú)法辨析關(guān)鍵字。像if、for、while等關(guān)鍵字之后應(yīng)留一個(gè)空格再跟左括號(hào)(,以突出關(guān)鍵字
1// 錯(cuò)誤示范 2if(...) 3 4// 正確示范 5if (...)
-
函數(shù)名之后不要留空格,應(yīng)緊跟左括號(hào)(,以與關(guān)鍵字區(qū)別
1// 錯(cuò)誤示范 2void move (char *buf, uint32_t length); 3 4// 正確示范 5void move(char *buf, uint32_t length);
-
(向后緊跟;)、,、;這三個(gè)向前緊跟;緊跟處不留空格
1// 錯(cuò)誤示范 2move ( buf , 35 ) ; 3 4// 正確示范 5move(buf, 35);
-
,之后要留空格。如果;不是一行的結(jié)束符號(hào),其后要留空格
1// 錯(cuò)誤示范 2move(buf,35); 3 4// 正確示范 5move(buf, 35);
-
賦值運(yùn)算符、關(guān)系運(yùn)算符、算術(shù)運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符,如=、==、!=、+=、-=、=`、`/=`、`%=`、`>>=`、`<<=`、`&=`、`^=`、`|=`、`<`、`<=`、`>`、`>=`、`+`、`-`、`、/、%、&;、|、&&、||、<<、>>;、^等雙目運(yùn)算符的前后應(yīng)當(dāng)加空格(運(yùn)算符“%”是求余運(yùn)算符,與printf中%d的“%”不同,所以%d中的“%”前后不用加空格)
1// 錯(cuò)誤示范 2num+=5; 3hex=hex&0x05; 4printf("% d", num); 5 6// 正確示范 7num += 5; 8hex = hex & 0x05; 9printf("%d", num);
-
單目運(yùn)算符!、~、++、--、-、*、&等前后不需要加空格
1// 錯(cuò)誤示范 2cnt ++; 3boolVal = ! boolVal; 4 5// 正確示范 6cnt++; 7boolVal = !boolVal;
-
像數(shù)組符號(hào)[]、結(jié)構(gòu)體成員運(yùn)算符.、和指向結(jié)構(gòu)體成員運(yùn)算符->,這類操作符前后不加空格
1// 錯(cuò)誤示范 2char buf [ 50 ]; 3tInfo -> mem = 0; 4 5// 正確示范 6char buf[50]; 7tInfo->mem = 0;
-
對(duì)于表達(dá)式比較長(zhǎng)的for語(yǔ)句和if語(yǔ)句,為了緊湊起見,可以適當(dāng)?shù)厝サ粢恍┛崭?。但for和if后面緊跟的空格不可以刪,其后面的語(yǔ)句可以根據(jù)語(yǔ)句的長(zhǎng)度適當(dāng)?shù)厝サ粢恍┛崭?。例如:for (i=0; i<10; i++),即for和分號(hào)后面保留空格,=和<前后的空格去掉
成對(duì)書寫
成對(duì)的符號(hào)一定要成對(duì)書寫,如()、{}。不要寫完左括號(hào)然后寫內(nèi)容最后再補(bǔ)右括號(hào),這樣很容易漏掉右括號(hào),尤其是寫嵌套程序的時(shí)候。
對(duì)齊
對(duì)齊主要是針對(duì)大括號(hào){}說(shuō)的
-
{和}分別都要獨(dú)占一行?;橐粚?duì)的{和}要位于同一列,并且與引用它們的語(yǔ)句左對(duì)齊
-
{}之內(nèi)的代碼要向內(nèi)一個(gè)縮進(jìn),且同一地位的要左對(duì)齊,地位不同的繼續(xù)縮進(jìn)
1// 錯(cuò)誤示范 2int main(void){ 3int val = 0; 4} 5 6// 正確示范 7// 錯(cuò)誤示范 8int main(void) 9{ 10 int val = 0; 11}
注釋
C語(yǔ)言中一行注釋一般采用//…,多行注釋必須采用/*…*/。注釋通常用于重要的代碼行或段落提示。在一般情況下,源程序有效注釋量必須在 20% 以上。雖然注釋有助于理解代碼,但注意不可過(guò)多地使用注釋,注釋太多會(huì)讓人眼花繚亂。
-
注釋用使用對(duì)代碼的功能做解釋,并不是說(shuō)明是怎么做的
-
對(duì)于一些巧妙地、用特殊方式實(shí)現(xiàn)功能的代碼,可以使用注釋說(shuō)明這樣做的目的或好處等
-
代碼十分明確的,一目了然的,則不必增加注釋,否則就是多余的注釋,如int minValue = 5; // 定義最小值為5
-
邊寫代碼邊注釋,修改代碼的同時(shí)要修改相應(yīng)的注釋,以保證注釋與代碼的一致性,不再有用的注釋要?jiǎng)h除
-
每一條宏定義的右邊必須要有注釋,說(shuō)明其作用
-
相關(guān)函數(shù)和結(jié)構(gòu)體等需要注釋,具體注釋方式請(qǐng)參考文檔中的“注釋規(guī)范”內(nèi)容
排版工具
嵌入式軟件開發(fā)常用軟件中提到的源格式化工具Astyle,官網(wǎng)地址
http://astyle.sourceforge.net/
Astyle 是一個(gè)開源的源碼格式化工具插件,可以集成在 KEIL、IAR 或者文本編輯器等多款軟件中,作為一個(gè)腳本自動(dòng)格式話代碼風(fēng)格,十分方便。
根據(jù)上述排版風(fēng)格,我設(shè)置的指令是:
--style=allman -t -xV -C -f -p -H -k3 -y -xb -j -U %f
如下圖,隨便打開一個(gè)糟糕的代碼文件,通過(guò) KEIL 集成的 Astyle工具自動(dòng)格式化代碼風(fēng)格。





