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