C编程规范
目 錄
?
1、版面... 4
2、命名... 5
3、注釋... 6
4、源代碼結(jié)構(gòu)... 11
附錄A:常見單詞縮寫表... 12
?
1、版面
?
【規(guī)則1-1】 程序塊要采用縮進(jìn)風(fēng)格編寫,縮進(jìn)的空格數(shù)為4個(gè)。
?
【規(guī)則1-2】 對(duì)齊與縮進(jìn)只使用空格鍵,不使用TAB鍵。說明:以免用不同的編輯器閱讀程序時(shí),因TAB鍵所設(shè)置的空格數(shù)目不同而造成程序布局不整齊,不要使用會(huì)自動(dòng)將8個(gè)空格變?yōu)橐粋€(gè)TAB鍵的開發(fā)工具編輯代碼。(可開發(fā)工具軟件自動(dòng)將TAB鍵轉(zhuǎn)換為4個(gè)空格)
?
【規(guī)則1-3】 函數(shù)或過程的開始、結(jié)構(gòu)的定義及循環(huán)、判斷等語句中的代碼都要采用縮進(jìn)風(fēng)格,case語句下的情況處理語句也要遵從語句縮進(jìn)要求。
?
【規(guī)則1-4】 相對(duì)獨(dú)立的程序塊之間、變量說明之后必須加空行(一個(gè)空行即可)。
?
【規(guī)則1-5】 一行程序以小于80字符為宜,不要寫得過長(zhǎng)。
?
【規(guī)則1-6】 較長(zhǎng)的語句(>80字符)要盡量分成多行書寫,長(zhǎng)表達(dá)式要在低優(yōu)先級(jí)操作符處劃分新行,操作符放在新行之首,劃分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊,語句可讀。
?
【規(guī)則1-7】 循環(huán)、判斷等語句中若有較長(zhǎng)的表達(dá)式或語句,則要進(jìn)行適應(yīng)的劃分,長(zhǎng)表達(dá)式要在低優(yōu)先級(jí)操作符處劃分新行,操作符放在新行之首。
?
【規(guī)則1-8】 若函數(shù)或過程中的參數(shù)較長(zhǎng),則要進(jìn)行適當(dāng)?shù)膭澐帧?/p>
?
【規(guī)則1-9】 不允許把多個(gè)短語句寫在一行中,即一行只寫一條語句。
?
【規(guī)則1-10】? if、for、do、while、case、switch、default等語句自占一行,且if、for、do、while等語句的執(zhí)行語句部分無論多少都要加括號(hào){}。
?
【規(guī)則1-11】? 程序塊的分界符(如C/C++語言的大括號(hào)‘{’和‘}’)應(yīng)各獨(dú)占一行并且位于同一列,同時(shí)與引用它們的語句左對(duì)齊。在函數(shù)體的開始、類的定義、結(jié)構(gòu)的定義、枚舉的定義以及if、for、do、while、switch、case語句中的程序都要采用縮進(jìn)方式。
?
【規(guī)則1-12】? 在兩個(gè)以上的關(guān)鍵字、變量、常量進(jìn)行對(duì)等操作時(shí),它們之間的操作符之前、之后或者前后要加空格;進(jìn)行非對(duì)等操作時(shí),如果是關(guān)系密切的立即操作符(如->),后不應(yīng)加空格。說明:采用這種松散方式編寫代碼的目的是使代碼更加清晰。由于留空格所產(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)志了。在長(zhǎng)語句中,如果需要加的空格非常多,那么應(yīng)該保持整體清晰,而在局部不加空格。給操作符留空格時(shí)不要連續(xù)留兩個(gè)以上空格。
1、?????逗號(hào)、分號(hào)只在后面加空格。
2、?????比較操作符, 賦值操作符"="、 "+=",算術(shù)操作符"+"、"%",邏輯操作符"&&"、"&",位域操作符"<<"、"^"等雙目操作符的前后加空格。
3、?????"!"、"~"、"++"、"--"、"&"(地址運(yùn)算符)等單目操作符前后可以不加空格。
4、?????"->"、"."前后不加空格。
5、?????if、for、while、switch等與后面的括號(hào)間應(yīng)加空格,使if等關(guān)鍵字更為突出、明顯。
?
【規(guī)則1-13】? 注意運(yùn)算符的優(yōu)先級(jí),并用括號(hào)明確表達(dá)式的操作順序,避免使用默認(rèn)優(yōu)先級(jí)。說明:防止閱讀程序時(shí)產(chǎn)生誤解,防止因默認(rèn)的優(yōu)先級(jí)與設(shè)計(jì)思想不符而導(dǎo)致程序出錯(cuò)。
?
【規(guī)則1-14】避免使用不易理解的數(shù)字,用有意義的標(biāo)識(shí)來替代。涉及物理狀態(tài)或者含有物理意義的常量,不應(yīng)直接使用數(shù)字,必須用有意義的枚舉或宏來代替。
?
【規(guī)則1-15】? 源程序中關(guān)系較為緊密的代碼應(yīng)盡可能相鄰。
?
【規(guī)則1-16】? 不要使用難懂的技巧性很高的語句,除非很有必要時(shí)。
2、命名
【規(guī)則2-1】 每一個(gè)C++類必須使用一個(gè)獨(dú)立的源文件進(jìn)行書寫(一個(gè).h文件或一個(gè).h和.cpp文件);并且要求文件名稱必須與類名相同(注意:文件名稱必須大小寫敏感)。
?
【規(guī)則2-2】 變量命名必須符合以下約束:
l? 變量名稱中獨(dú)立單詞的首字母必須大寫,其它字母小寫。
l? 變量名稱中的獨(dú)立單詞為標(biāo)準(zhǔn)術(shù)語的縮寫詞匯,允許全部大寫。
l? 變量名稱中的獨(dú)立單詞一般情況下必須使用全稱,允許在適當(dāng)?shù)那闆r下使用縮寫,常見單詞縮寫參見附錄A。
l? 變量名稱之前必須附加前綴用來識(shí)別變量類型,前綴標(biāo)準(zhǔn)定義如下:
| 類型 | 前綴 | 備注 |
| short int long | n | 帶符號(hào)整數(shù) |
| unsigned short unsigned integer unsigned long | u | 無符號(hào)整數(shù) |
| char unsigned char | c | 字符 |
| float double | f | 浮點(diǎn)數(shù) |
| bool | b | 布爾量 |
| char* unsigned char* | sz | 程序中明確作為字符串使用 |
| char* unsigned char* | bf | 程序中明確存放的是二進(jìn)制數(shù)據(jù) |
| WORD | w | Windows平臺(tái)專用 |
| DWORD | dw | Windows平臺(tái)專用 |
| 類 | o | 所有類定義的實(shí)例對(duì)象一律使用“o”作為前綴 |
| 指針 | p | 一般p后面會(huì)跟隨一個(gè)指示具體類型的前綴,例如“pu”表示一個(gè)無符號(hào)數(shù)指針,“po”表示一個(gè)對(duì)象指針 |
| 指針的指針 | pp | 其它更多指針依此類推 |
?
l? 針對(duì)基本類型重定義的新類型,前綴參照原始數(shù)據(jù)類型的前綴,例如“size_t”類型前綴為“u”。
l? C++類和結(jié)構(gòu)的成員變量名在符合前面的規(guī)范基礎(chǔ)上再附加前綴“m_”。
l? 跨模塊使用的全局變量名稱在符合前面的規(guī)范基礎(chǔ)上再附加前綴“g_”。
l? 模塊內(nèi)部使用的全局變量名稱在符合前面的規(guī)范基礎(chǔ)上再附加前綴“_g_”。
l? 單字符變量只能用作循環(huán)變量。
?
【規(guī)則2-3】 函數(shù)命名必須符合以下約束:
l? 函數(shù)名稱中獨(dú)立單詞的首字母必須大寫,其它字母小寫(特例:允許第一個(gè)單詞首字母小寫)。
l? 函數(shù)名稱中第一個(gè)單詞必須是動(dòng)詞,盡量不使用縮寫(除非是眾所周知的縮寫單詞)。
l? 函數(shù)名稱中的獨(dú)立單詞為標(biāo)準(zhǔn)術(shù)語的縮寫詞匯,允許全部大寫。
l? 函數(shù)名稱中的獨(dú)立單詞一般情況下必須使用全稱,允許在適當(dāng)?shù)那闆r下使用縮寫,常見單詞縮寫參見附錄A。
?
3、注釋
【規(guī)則3-1】 本規(guī)范規(guī)定程序注釋采用文檔生成工具DOXYGEN進(jìn)行處理。
?
【規(guī)則3-2】 源文件.cpp、頭文件.h文件及其它說明性文件頭部必須進(jìn)行注釋,注釋如下格式所示。
?
| ? /** ? @file???? ? 程序文件名稱(如ByteBuffer.cpp) ? @brief??? 程序文件的簡(jiǎn)要說明 ??? ???? ???? ???? ??? ???? ???? ???? 程序文件的詳細(xì)說明(簡(jiǎn)要與詳細(xì)說明之間間隔一個(gè)空行) ? @author? 作者姓名 ? @version ? 版本編號(hào) ??修訂日期 修訂者 修訂內(nèi)容 ?*/ ? 注: l? 注釋必須以“/**”開頭 l? 允許存在多個(gè)@version指示符描述版本修訂歷程(每個(gè)@version指示符描述一個(gè)版本) |
?
【規(guī)則3-3】 源程序模塊函數(shù)接口(允許在其它模塊使用的函數(shù))必須注釋,注釋如下格式所示。
?
| ? /** ? @brief??? 函數(shù)的簡(jiǎn)要說明 ??? ???? ???? ???? ??? ???? ???? ???? 函數(shù)的詳細(xì)說明(簡(jiǎn)要與詳細(xì)說明之間間隔一個(gè)空行) ? @param? 參數(shù)名稱 參數(shù)說明 ? @return? ? 返回值說明 ? @retval? ? 值 返回值具體單個(gè)值說明 */ ? 注: l? 注釋必須以“/**”開頭 l? 注釋必須置于函數(shù)定義原型之上 l? 允許存在多個(gè)@param指示符描述多個(gè)參數(shù)(每個(gè)@param指示符描述一個(gè)參數(shù)) l? 允許存在多個(gè)@retval指示符描述多個(gè)具體的返回值說明(每個(gè)retval指示符描述一個(gè)返回值) l? @param、@return、@retval指示符均是可選項(xiàng) |
?
【規(guī)則3-4】 源程序模塊內(nèi)部函數(shù)接口(即模塊內(nèi)部的私有函數(shù))可以不必注釋,一旦注釋,采取如下格式所示。
?
| ? /* ? @brief??? 函數(shù)的簡(jiǎn)要說明 ??? ???? ???? ???? ??? ???? ???? ???? 函數(shù)的詳細(xì)說明(簡(jiǎn)要與詳細(xì)說明之間間隔一個(gè)空行) ? @param? 參數(shù)名稱 參數(shù)說明 ? @return? ? 返回值說明 ? @retval? ? 值 返回值具體單個(gè)值說明 */ ? 注: l? 注釋必須以“/*”開頭 l? 注釋必須置于函數(shù)定義原型之上 l? 允許存在多個(gè)@param指示符描述多個(gè)參數(shù)(每個(gè)@param指示符描述一個(gè)參數(shù)) l? 允許存在多個(gè)@retval指示符描述多個(gè)具體的返回值說明(每個(gè)retval指示符描述一個(gè)返回值) l? @param、@return、@retval指示符均是可選項(xiàng) l? 對(duì)于一些非常簡(jiǎn)單的模塊內(nèi)部私有函數(shù)可以使用簡(jiǎn)單注釋,不作強(qiáng)制規(guī)范要求 |
?
【規(guī)則3-5】 源程序模塊變量接口(允許在其它模塊使用的變量)必須注釋,注釋如下格式所示(有兩種注釋格式)。
?
格式一:
| ? /** ? @brief??? 變量的簡(jiǎn)要說明 ??? ???? ???? ???? ??? ???? ???? ???? 變量的詳細(xì)說明(簡(jiǎn)要與詳細(xì)說明之間間隔一個(gè)空行) */ ? 注: l? 注釋必須以“/**”開頭 l? 注釋必須置于變量定義之上 |
?
格式二:
| ? ? ///< 變量的說明 ? 注: l? 注釋必須以“///<”開頭 l? 注釋必須置于變量定義之后,與變量定義處于同一行 |
?
【規(guī)則3-6】源程序模塊內(nèi)部變量接口(即模塊內(nèi)部的私有變量)可以不必注釋,一旦注釋,采取如下格式所示(有兩種注釋格式)。
?
格式一:
| ? /* ? @brief??? 變量的簡(jiǎn)要說明 ??? ???? ???? ???? ??? ???? ???? ???? 變量的詳細(xì)說明(簡(jiǎn)要與詳細(xì)說明之間間隔一個(gè)空行) */ ? 注: l? 注釋必須以“/*”開頭 l? 注釋必須置于變量定義之上 |
?
格式二:
| ? ? // 變量的說明 ? 注: l? 注釋必須以“//”開頭 l? 注釋必須置于變量定義之后,與變量定義處于同一行 |
?
【規(guī)則3-7】 源程序模塊自定義類型必須注釋(含結(jié)構(gòu)、C++類等),注釋如下格式所示。
?
| ? /** ? @brief??? 類型的簡(jiǎn)要說明 ??? ???? ???? ???? ??? ???? ???? ???? 類型的詳細(xì)說明(簡(jiǎn)要與詳細(xì)說明之間間隔一個(gè)空行) */ ? 注: l? 注釋必須以“/**”開頭 l? 注釋必須置于類型定義之上 l? 對(duì)子元素的注釋可參照對(duì)函數(shù)、變量的注釋格式 |
?
【規(guī)則3-8】 一般情況下,源程序有效注釋量必須達(dá)到20%以上。
?
【規(guī)則3-9】 邊寫代碼邊注釋,修改代碼同時(shí)修改相應(yīng)的注釋,以保證注釋與代碼的一致性。不再有用的注釋要?jiǎng)h除。
?
【規(guī)則3-10】? 注釋的內(nèi)容要清楚、明了,含義準(zhǔn)確,防止注釋二義性。說明:錯(cuò)誤的注釋不但無益反而有害。
?
【規(guī)則3-11】? 避免在注釋中使用縮寫,特別是非常用縮寫。說明:在使用縮寫時(shí)或之前,應(yīng)對(duì)縮寫進(jìn)行必要的說明。
?
【規(guī)則3-12】 注釋應(yīng)與其描述的代碼相近,對(duì)代碼的注釋應(yīng)放在其上方或右方(對(duì)單條語句的注釋)相鄰位置,不可放在下面,如放于上方則需與其上面的代碼用空行隔開。
?
【規(guī)則3-13】 對(duì)于所有有物理含義的變量、常量,如果其命名不是充分自注釋的,在聲明時(shí)都必須加以注釋,說明其物理含義。變量、常量、宏的注釋應(yīng)放在其上方相鄰位置或右方。
?
【規(guī)則3-14】 數(shù)據(jù)結(jié)構(gòu)聲明(包括數(shù)組、結(jié)構(gòu)、類、枚舉等),如果其命名不是充分自注釋的,必須加以注釋。對(duì)數(shù)據(jù)結(jié)構(gòu)的注釋應(yīng)放在其上方相鄰位置,不可放在下面;對(duì)結(jié)構(gòu)中的每個(gè)域的注釋放在此域的右方。
?
【規(guī)則3-15】 全局變量要有較詳細(xì)的注釋,包括對(duì)其功能、取值范圍、哪些函數(shù)或過程存取它以及存取時(shí)注意事項(xiàng)等的說明。
?
【規(guī)則3-16】 注釋與所描述內(nèi)容進(jìn)行同樣的縮排。說明:可使程序排版整齊,并方便注釋的閱讀與理解。
?
【規(guī)則3-17】 將注釋與其上面的代碼用空行隔開。
?
【規(guī)則3-18】 對(duì)變量的定義和分支語句(條件分支、循環(huán)語句等)必須編寫注釋。說明:這些語句往往是程序?qū)崿F(xiàn)某一特定功能的關(guān)鍵,對(duì)于維護(hù)人員來說,良好的注釋幫助更好的理解程序,有時(shí)甚至優(yōu)于看設(shè)計(jì)文檔。
?
【規(guī)則3-19】 對(duì)于switch語句下的case語句,如果因?yàn)樘厥馇闆r需要處理完一個(gè)case后進(jìn)入下一個(gè)case處理,必須在該case語句處理完、下一個(gè)case語句前加上明確的注釋。說明:這樣比較清楚程序編寫者的意圖,有效防止無故遺漏break語句。
?
【規(guī)則3-20】 避免在一行代碼或表達(dá)式的中間插入注釋。說明:除非必要,不應(yīng)在代碼或表達(dá)式中間插入注釋,否則容易使代碼可理解性變差。
?
【規(guī)則3-21】 通過對(duì)函數(shù)或過程、變量、結(jié)構(gòu)等正確的命名以及合理地組織代碼的結(jié)構(gòu),使代碼成為自注釋的。說明:清晰準(zhǔn)確的函數(shù)、變量等的命名,可增加代碼可讀性,并減少不必要的注釋。
?
【規(guī)則3-22】 在代碼的功能、意圖層次上進(jìn)行注釋,提供有用、額外的信息。說明:注釋的目的是解釋代碼的目的、功能和采用的方法,提供代碼以外的信息,幫助讀者理解代碼,防止沒必要的重復(fù)注釋信息。
?
【規(guī)則3-23】 在程序塊的結(jié)束行右方加注釋標(biāo)記,以表明某程序塊的結(jié)束。說明:當(dāng)代碼段較長(zhǎng),特別是多重嵌套時(shí),這樣做可以使代碼更清晰,更便于閱讀。
?
【規(guī)則3-24】 注釋應(yīng)考慮程序易讀及外觀排版的因素,使用的語言若是中、英兼有的,建議多使用中文,除非能用非常流利準(zhǔn)確的英文表達(dá)。說明:注釋語言不統(tǒng)一,影響程序易讀性和外觀排版,出于對(duì)維護(hù)人員的考慮,建議使用中文。
4、源代碼結(jié)構(gòu)
【規(guī)則4-1】 本規(guī)范規(guī)定源代碼結(jié)構(gòu)必須符合如下規(guī)范:
l? 源代碼目錄結(jié)構(gòu)如下:
l? 源代碼目錄結(jié)構(gòu)說明如下:
?
| 名稱 | 說明 |
| doc | 存放源代碼相關(guān)的說明文檔及通過Doxygen生成的源代碼注釋文檔 |
| include | 存放程序使用的庫程序的頭文件及本程序提供給外部使用的頭文件 |
| src | 存放程序中與平臺(tái)無關(guān)的源代碼 |
| win32 | 存放Windows平臺(tái)相關(guān)的源代碼及Windows平臺(tái)下的工程文件、編譯臨時(shí)文件和編譯后的目標(biāo)程序文件(debug和release版) |
| win32_release | 存放Windows平臺(tái)程序使用的庫程序(dll和lib)及本程序提供給外部使用的庫程序(dll和lib)(注:要求debug和release版本對(duì)應(yīng)的庫程序文件不同,例如在debug版本的庫文件名后附加字符“d”); 存放本程序編譯的release版本程序文件 |
| linux | 存放Linux平臺(tái)相關(guān)的源代碼及Linux平臺(tái)下的工程文件、編譯臨時(shí)文件和編譯后的目標(biāo)程序文件(debug和release版) |
| linux_release | 存放Linux平臺(tái)下本程序使用的庫程序及本程序提供給外部使用的庫程序; 存放Linux平臺(tái)下本程序編譯的release版本程序文件 |
注:
n? 當(dāng)需要同時(shí)編譯成VC6和VS2005目標(biāo)程序時(shí),可以創(chuàng)建多個(gè)“win32_release”目錄,目錄名稱可通過附加后綴進(jìn)行區(qū)分,例如“win32_release.net”。
n? 當(dāng)需要同時(shí)編譯成支持不同內(nèi)核版本的Linux目標(biāo)程序,可以創(chuàng)建多個(gè)“l(fā)inux_release”目錄,目錄名稱可通過附加內(nèi)核版本作為后綴進(jìn)行區(qū)分。
附錄A:常見單詞縮寫表
| 單詞 | 縮寫 |
| source | src |
| destination | dst |
| command | cmd |
| program | prg |
| send | snd |
| sender | sndr |
| receive | recv |
| receiver | recvr |
?
轉(zhuǎn)載于:https://www.cnblogs.com/lgh1992314/p/5834731.html
總結(jié)
- 上一篇: (转载)[FFmpeg]使用ffmpeg
- 下一篇: centos 6.5 配置LDAP服务器