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