規(guī)范的代碼可以促進(jìn)團(tuán)隊(duì)合作,一個(gè)項(xiàng)目大多都是由一個(gè)團(tuán)隊(duì)來完成,如果沒有統(tǒng)一的代碼規(guī)范,那么每個(gè)人的代碼必定會(huì)風(fēng)格迥異,等到要整合代碼的時(shí)候也有夠頭疼的了。
我認(rèn)為,編碼規(guī)范,在軟件構(gòu)件以及項(xiàng)目管理中,甚至是個(gè)人成長(zhǎng)方面,都發(fā)揮著重要的作用,好的編碼規(guī)范是提高我們代碼質(zhì)量的最有效的工具之一。
幾乎每個(gè)項(xiàng)目,每家公司都會(huì)定義自己的編碼規(guī)范,我們可以參考一下華為公司C/C++的編碼規(guī)范。
1、代碼排版
1.1 程序塊要采用縮進(jìn)風(fēng)格編寫, 縮進(jìn)的空格數(shù)為4個(gè)。(說明: 對(duì)于由開發(fā)工具自動(dòng)生成的代碼可以有不一致)
1.2 相對(duì)獨(dú)立的程序塊之間、變量說明之后必須加空行。
1.3 循環(huán)、判斷等語句中若有較長(zhǎng)的表達(dá)式或語句, 則要進(jìn)行適應(yīng)的劃分, 長(zhǎng)表達(dá)式要在低優(yōu)先級(jí)操作符處劃分新行, 操作符放在新行之首。
1.4 若函數(shù)或過程中的參數(shù)較長(zhǎng), 則要進(jìn)行適當(dāng)?shù)膭澐帧?/p>
1.5 不允許把多個(gè)短語句寫在一行中, 即一行只寫一條語句。
1.6 if、for、do、while、case、switch、default等語句自占一行, 且if、for、do、while等語句的執(zhí)行語句部分無論多少都要加括號(hào){}。
1.7 對(duì)齊只使用空格鍵, 不使用TAB鍵。
1.8 函數(shù)或過程的開始、結(jié)構(gòu)的定義及循環(huán)、判斷等語句中的代碼都要采用縮進(jìn)風(fēng)格, case 語句下的情況處理語句也要遵從語句縮進(jìn)要求。
1.9 程序塊的分界符(如C/C++ 語言的大括號(hào)‘{’ 和‘}’ )應(yīng)各獨(dú)占一行并且位于同一列, 同時(shí)與引用它們的語句左對(duì)齊。在函數(shù)體的開始、類的定義、結(jié)構(gòu)的定義、枚舉的定義以及if、for、do、while、switch、case 語句中的程序都要采用如上的縮進(jìn)方式。
1.10 在兩個(gè)以上的關(guān)鍵字、變量、常量進(jìn)行對(duì)等操作時(shí), 它們之間的操作符之前、之后或者前后要加空格; 進(jìn)行非對(duì)等操作時(shí), 如果是關(guān)系密切的立即操作符(如-》), 后不應(yīng)加空格。(說明: 采用這種松散方式編寫代碼的目的是使代碼更加清晰。)
注:(1)由于留空格所產(chǎn)生的清晰性是相對(duì)的, 所以, 在已經(jīng)非常清晰的語句中沒有必要再留空格, 如果語句已足夠清晰則括號(hào)內(nèi)側(cè)(即左括號(hào)后面和右括號(hào)前面)不需要加空格, 多重括號(hào)間不必加空格, 因?yàn)樵贑/C++語言中括號(hào)已經(jīng)是最清晰的標(biāo)志了。
(2)在長(zhǎng)語句中, 如果需要加的空格非常多, 那么應(yīng)該保持整體清晰, 而在局部不加空格。給操作符留空格時(shí)不要連續(xù)留兩個(gè)以上空格。
2、代碼注釋
2.1 一般情況下, 源程序有效注釋量必須在20%以上。(說明: 注釋的原則是有助于對(duì)程序的閱讀理解, 在該加的地方都加了, 注釋不宜太多也不能太少, 注釋語言必須準(zhǔn)確、易懂、簡(jiǎn)潔。)
2.2 說明性文件(如頭文件.h 文件、.inc 文件、.def 文件、編譯說明文件.cfg 等)頭部應(yīng)進(jìn)行注釋, 注釋必須列出: 版權(quán)說明、版本號(hào)、生成日期、作者、內(nèi)容、功能、與其它文件的關(guān)系、修改日志等, 頭文件的注釋中還應(yīng)有函數(shù)功能簡(jiǎn)要說明。
2.3 源文件頭部應(yīng)進(jìn)行注釋, 列出: 版權(quán)說明、版本號(hào)、生成日期、作者、模塊目的/功能、主要函數(shù)及其功能、修改日志等。
2.4 函數(shù)頭部應(yīng)進(jìn)行注釋, 列出: 函數(shù)的目的/ 功能、輸入?yún)?shù)、輸出參數(shù)、返回值、調(diào)用關(guān)系(函數(shù)、表)等
示例: 下面這段函數(shù)的注釋比較標(biāo)準(zhǔn), 當(dāng)然, 并不局限于此格式, 但上述信息建議要包含在內(nèi)。
Function: // 函數(shù)名稱
Description: // 函數(shù)功能、性能等的描述
Calls: // 被本函數(shù)調(diào)用的函數(shù)清單
Called By: // 調(diào)用本函數(shù)的函數(shù)清單
Table Accessed: // 被訪問的表(此項(xiàng)僅對(duì)于牽扯到數(shù)據(jù)庫操作的程序)
Table Updated: // 被修改的表(此項(xiàng)僅對(duì)于牽扯到數(shù)據(jù)庫操作的程序)
Input: // 輸入?yún)?shù)說明, 包括每個(gè)參數(shù)的作用、取值說明及參數(shù)間關(guān)系
Output: // 對(duì)輸出參數(shù)的說明
Return: // 函數(shù)返回值的說明
2.5 邊寫代碼邊注釋, 修改代碼同時(shí)修改相應(yīng)的注釋, 以保證注釋與代碼的一致性。不再有用的注釋要?jiǎng)h除。
2.6 注釋的內(nèi)容要清楚、明了, 含義準(zhǔn)確, 防止注釋二義性。
2.7 避免在注釋中使用縮寫, 特別是非常用縮寫
2.8 注釋應(yīng)與其描述的代碼相近, 對(duì)代碼的注釋應(yīng)放在其上方或右方(對(duì)單條語句的注釋)相鄰位置, 不可放在下面, 如放于上方則需與其上面的代碼用空行隔開。
2.9 對(duì)于所有有物理含義的變量、常量, 如果其命名不是充分自注釋的, 在聲明時(shí)都必須加以注釋, 說明其物理含義。變量、常量、宏的注釋應(yīng)放在其上方相鄰位置或右方。
2.10 數(shù)組、結(jié)構(gòu)、類、枚舉等) , 如果其命名不是充分自注釋的, 必須加以注釋。對(duì)數(shù)據(jù)結(jié)構(gòu)的注釋應(yīng)放在其上方相鄰位置, 不可放在下面; 對(duì)結(jié)構(gòu)中的每個(gè)域的注釋放在此域的右方。
2.11 全局變量要有較詳細(xì)的注釋, 包括對(duì)其功能、取值范圍、哪些函數(shù)或過程存取它以及存取時(shí)注意事項(xiàng)等的說明。
2.12 注釋與所描述內(nèi)容進(jìn)行同樣的縮排。
2.13 將注釋與其上面的代碼用空行隔開。
2.14 函數(shù)的頭部應(yīng)進(jìn)行注釋,列出函數(shù)的功能、目的、輸入輸出參數(shù)、返回值、調(diào)用關(guān)系(表、函數(shù))等
2.15 對(duì)變量的定義和分支語句(條件分支、循環(huán)語句等)必須編寫注釋。
2.16 對(duì)于switch語句下的case語句, 如果因?yàn)樘厥馇闆r需要處理完一個(gè)case后進(jìn)入下一個(gè)case處理, 必須在該case語句處理完、下一個(gè)case語句前加上明確的注釋。
3、標(biāo)識(shí)(zhi)符命名
3.1 標(biāo)識(shí)符的命名要清晰、明了, 有明確含義, 同時(shí)使用完整的單詞或大家基本可以理解的縮寫, 避免使人產(chǎn)生誤解。(說明: 較短的單詞可通過去掉“元音”形成縮寫; 較長(zhǎng)的單詞可取單詞的頭幾個(gè)字母形成縮寫; 一些單詞有大家公認(rèn)的縮寫。)
示例: 如下單詞的縮寫能夠被大家基本認(rèn)可。
temp可縮寫為 tmp; 臨時(shí)
flag可縮寫為 flg; 標(biāo)志
statistic可縮寫為 stat ; 統(tǒng)計(jì)
increment可縮寫為 inc; 增量
message可縮寫為 msg; 消息
3.2 命名中若使用特殊約定或縮寫, 則要有注釋說明。(說明: 應(yīng)該在源文件的開始之處, 對(duì)文件中所使用的縮寫或約定, 特別是特殊的縮寫, 進(jìn)行必要的注釋說明。)
3.3 自己特有的命名風(fēng)格, 要自始至終保持一致, 不可來回變化。(說明: 個(gè)人的命名風(fēng)格, 在符合所在項(xiàng)目組或產(chǎn)品組的命名規(guī)則的前提下, 才可使用。即命名規(guī)則中沒有規(guī)定到的地方才可有個(gè)人命名風(fēng)格。)
3.4 對(duì)于變量命名, 禁止取單個(gè)字符(如i、j、k… ), 建議除了要有具體含義外, 還能表明其變量類型、數(shù)據(jù)類型等, 但i、j、k 作局部循環(huán)變量是允許的。
說明: 變量, 尤其是局部變量, 如果用單個(gè)字符表示, 很容易敲錯(cuò)(如i寫成j), 而編譯時(shí)又檢查不出來, 有可能為了這個(gè)小小的錯(cuò)誤而花費(fèi)大量的查錯(cuò)時(shí)間。
3.5 命名規(guī)范必須與所使用的系統(tǒng)風(fēng)格保持一致, 并在同一項(xiàng)目中統(tǒng)一, 比如采用UNIX的全小寫加下劃線的風(fēng)格或大小寫混排的方式, 不要使用大小寫與下劃線混排的方式, 用作特殊標(biāo)識(shí)如標(biāo)識(shí)成員變量或全局變量的m_ 和g_ , 其后加上大小寫混排的方式是允許的
4、代碼可讀性
4.1 注意運(yùn)算符的優(yōu)先級(jí),并用括號(hào)明確表達(dá)式的操作順序,避免使用默認(rèn)優(yōu)先級(jí)。
4.2 避免使用不易理解的數(shù)字, 用有意義的標(biāo)識(shí)來替代。涉及物理狀態(tài)或者含有物理意義的常量, 不應(yīng)直接使用數(shù)字, 必須用有意義的枚舉或宏來代替。
5、變量、結(jié)構(gòu)
5.1 去掉沒必要的公共變量。
說明: 公共變量是增大模塊間耦合的原因之一, 故應(yīng)減少?zèng)]必要的公共變量以降低模塊間的耦合度。
5.2 仔細(xì)定義并明確公共變量的含義、作用、取值范圍及公共變量間的關(guān)系。
說明: 在對(duì)變量聲明的同時(shí), 應(yīng)對(duì)其含義、作用及取值范圍進(jìn)行注釋說明, 同時(shí)若有必要還應(yīng)說明與其它變量的關(guān)系。
5.3 明確公共變量與操作此公共變量的函數(shù)或過程的關(guān)系, 如訪問、修改及創(chuàng)建等。
說明: 明確過程操作變量的關(guān)系后, 將有利于程序的進(jìn)一步優(yōu)化、單元測(cè)試、系統(tǒng)聯(lián)調(diào)以及代碼維護(hù)等。這種關(guān)系的說明可在注釋或文檔中描述。
示例: 在源文件中, 可按如下注釋形式說明。
RELATION System_Init Input_Rec Print_Rec Stat_Score
Student Create Modify Access Access
Score Create Modify Access Access, Modify
注: RELATION為操作關(guān)系; System_Init、Input_Rec、Print_Rec、Stat_Score為四個(gè)不同的函數(shù); Student、Score為兩個(gè)全局變量; Create表示創(chuàng)建, Modify表示修改, Access表示訪問。
其中, 函數(shù)Input_Rec、Stat_Score都可修改變量Score, 故此變量將引起函數(shù)間較大的耦合, 并可能增加代碼測(cè)試、維護(hù)的難度。
5.4 當(dāng)向公共變量傳遞數(shù)據(jù)時(shí), 要十分小心, 防止賦與不合理的值或越界等現(xiàn)象發(fā)生。
說明: 對(duì)公共變量賦值時(shí), 若有必要應(yīng)進(jìn)行合法性檢查, 以提高代碼的可靠性、穩(wěn)定性。
5.5 防止局部變量與公共變量同名。
說明: 若使用了較好的命名規(guī)則, 那么此問題可自動(dòng)消除。
5.6 嚴(yán)禁使用未經(jīng)初始化的變量作為右值。
說明: 特別是在C/C++中引用未經(jīng)賦值的指針, 經(jīng)常會(huì)引起系統(tǒng)崩潰。
6、函數(shù)、過程
6.1 對(duì)所調(diào)用函數(shù)的錯(cuò)誤返回碼要仔細(xì)、全面地處理
6.2 明確函數(shù)功能, 精確(而不是近似)地實(shí)現(xiàn)函數(shù)設(shè)計(jì)
6.3 編寫可重入函數(shù)時(shí), 應(yīng)注意局部變量的使用(如編寫C/C++ 語言的可重入函數(shù)時(shí), 應(yīng)使用auto 即缺省態(tài)局部變量或寄存器變量)
說明: 編寫C/C++語言的可重入函數(shù)時(shí), 不應(yīng)使用static局部變量, 否則必須經(jīng)過特殊處理, 才能使函數(shù)具有可重入性。
6.4 編寫可重入函數(shù)時(shí), 若使用全局變量, 則應(yīng)通過關(guān)中斷、信號(hào)量(即P、V 操作)等手段對(duì)其加以保護(hù)
說明: 若對(duì)所使用的全局變量不加以保護(hù), 則此函數(shù)就不具有可重入性, 即當(dāng)多個(gè)進(jìn)程調(diào)用此函數(shù)時(shí), 很有可能使有關(guān)全局變量變?yōu)椴豢芍獱顟B(tài)。
示例: 假設(shè)Exam是int型全局變量, 函數(shù)Squre_Exam返回Exam平方值。那么如下函數(shù)不具有可重入性。
unsigned int example( int para )
{
unsigned int temp;
Exam = para; // ()
temp = Square_Exam( );
return temp;
}
此函數(shù)若被多個(gè)進(jìn)程調(diào)用的話, 其結(jié)果可能是未知的, 因?yàn)楫?dāng)()語句剛執(zhí)行完后, 另外一個(gè)使用本函數(shù)的進(jìn)程可能正好被激活, 那么當(dāng)新激活的進(jìn)程執(zhí)行到此函數(shù)時(shí), 將使Exam賦與另一個(gè)不同的para值, 所以當(dāng)控制重新回到“temp = Square_Exam( )”后, 計(jì)算出的temp很可能不是預(yù)想中的結(jié)果。此函數(shù)應(yīng)如下改進(jìn)。
unsigned int example( int para )
{
unsigned int temp;[申請(qǐng)信號(hào)量操作] // 若申請(qǐng)不到“信號(hào)量”, 說明另外的進(jìn)程正處于
Exam = para; // 給Exam賦值并計(jì)算其平方過程中(即正在使用此信號(hào)), 本進(jìn)程必須等待其釋放信號(hào)后, 才可繼續(xù)執(zhí)行。若申請(qǐng)到信號(hào), 則可繼續(xù)執(zhí)行, 但其它進(jìn)程必須等待本進(jìn)程釋放信號(hào)量后, 才能再使用本信號(hào)。
temp = Square_Exam( ); // [釋放信號(hào)量操作]
return temp;
}
6.5 在同一項(xiàng)目組應(yīng)明確規(guī)定對(duì)接口函數(shù)參數(shù)的合法性檢查應(yīng)由函數(shù)的調(diào)用者負(fù)責(zé)還是由接口函數(shù)本身負(fù)責(zé), 缺省是由函數(shù)調(diào)用者負(fù)責(zé)
說明: 對(duì)于模塊間接口函數(shù)的參數(shù)的合法性檢查這一問題, 往往有兩個(gè)極端現(xiàn)象, 即: 要么是調(diào)用者和被調(diào)用者對(duì)參數(shù)均不作合法性檢查, 結(jié)果就遺漏了合法性檢查這一必要的處理過程, 造成問題隱患; 要么就是調(diào)用者和被調(diào)用者均對(duì)參數(shù)進(jìn)行合法性檢查, 這種情況雖不會(huì)造成問題, 但產(chǎn)生了冗余代碼, 降低了效率。
7、程序效率
7.1 編程時(shí)要經(jīng)常注意代碼的效率
7.2 在保證軟件系統(tǒng)的正確性、可讀性、穩(wěn)定性及可測(cè)試性的前提下,提高代碼效率
7.3 對(duì)模塊中函數(shù)的劃分及組織方式進(jìn)行分析、優(yōu)化, 改進(jìn)模塊中函數(shù)的組織結(jié)構(gòu), 提高程序效率
7.4 編程時(shí), 要隨時(shí)留心代碼效率; 優(yōu)化代碼時(shí), 要考慮周全
7.5 不應(yīng)花過多的時(shí)間拼命地提高調(diào)用不很頻繁的函數(shù)代碼效率
7.6 要仔細(xì)地構(gòu)造或直接用匯編編寫調(diào)用頻繁或性能要求極高的函數(shù)
7.7 在保證程序質(zhì)量的前提下, 通過壓縮代碼量、去掉不必要代碼以及減少不必要的局部和全局變量, 來提高空間效率
7.8 在多重循環(huán)中, 應(yīng)將最忙的循環(huán)放在最內(nèi)層
7.9 盡量減少循環(huán)嵌套層次
7.10 避免循環(huán)體內(nèi)含判斷語句, 應(yīng)將循環(huán)語句置于判斷語句的代碼塊之中
7.11 盡量用乘法或其他的方法代替除法,特別是浮點(diǎn)運(yùn)算中的除法
7.12 不要一味追求緊湊的代碼
最后提醒一句,“任何一個(gè)傻瓜都能寫出計(jì)算機(jī)可以理解的代碼,唯有寫出人類容易理解的代碼,才是優(yōu)秀的程序員。” 制定一個(gè)符合自己公司情況的開發(fā)規(guī)范是很簡(jiǎn)單的,重要的是我們能夠認(rèn)識(shí)到規(guī)范的重要性,并堅(jiān)持規(guī)范的開發(fā)習(xí)慣。
審核編輯 :李倩
-
華為
+關(guān)注
關(guān)注
216文章
34470瀏覽量
251935 -
編程
+關(guān)注
關(guān)注
88文章
3619瀏覽量
93778 -
C++
+關(guān)注
關(guān)注
22文章
2110瀏覽量
73687
原文標(biāo)題:華為C/C++編碼規(guī)范流出
文章出處:【微信號(hào):技術(shù)讓夢(mèng)想更偉大,微信公眾號(hào):技術(shù)讓夢(mèng)想更偉大】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論