偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

最全面的C/C++編碼規(guī)范總結(jié)

開發(fā) 后端
對于不同的編程語言來說,具體的編碼規(guī)范可以有很大的不同,但是其宗旨都是一致的,就是保證代碼在高質(zhì)量完成需求的同時具備良好的可讀性、可維護性。

對于不同的編程語言來說,具體的編碼規(guī)范可以有很大的不同,但是其宗旨都是一致的,就是保證代碼在高質(zhì)量完成需求的同時具備良好的可讀性、可維護性。例如我們可以規(guī)定某個項目的C語言程序要遵循這樣的規(guī)定:變量的命名,頭文件的書寫和#include 等等。

下面是一些廣為采用的編碼規(guī)范:

  • GNU Coding Standards

  • Guidelines for the Use of the C Language in Vehicle Based Software

  • C++ Coding Guidelines

  • SUN Code Conventions for Java

以下是一些介紹編碼、編碼規(guī)范的書籍:

  • C++編碼規(guī)范,陳世忠,人民郵電出版社,2002

  • 高質(zhì)量程序設計指南:C++/C語言,林銳等,電子工業(yè)出版社,2003

注:以下只是根據(jù)課題組已有的經(jīng)驗給出的總結(jié),并非對所有場景均適用。

對于高質(zhì)量的工程,一般會做到:

  1. 代碼簡潔精煉,美觀,可讀性好,高效率,高復用,可移植性好,高內(nèi)聚,低耦合,沒有冗余,不符合這些原則,必須特別說明。

  2. 規(guī)范性,代碼有規(guī)可循。特殊排版、特殊語法、特殊指令,必須特別說明。

一、文件排版方面

1.包含頭文件

 

1.1 先系統(tǒng)頭文件,后用戶頭文件。

 

1.2 系統(tǒng)頭文件,穩(wěn)定的目錄結(jié)構(gòu),應采用包含子路徑方式。

 

1.3 自定義頭文件,不穩(wěn)定目錄結(jié)構(gòu),應在dsp中指定包含路徑。

 

1.4 系統(tǒng)頭文件應用:#include <xxx.h>

 

1.5 自定義同文件應用:#include "xxx.h"

 

1.6 只引用需要的頭文件。

 

2.h和cpp文件

 

2.1 頭文件命名為*.h,內(nèi)聯(lián)文件命名為*.inl;C++文件命名為*.cpp

 

2.2 文件名用大小寫混合,或者小寫混合。例如DiyMainview.cpp,infoview.cpp。不要用無意義的名稱:例如XImage.cpp;SView.cpp;xlog.cpp

 

2.3 頭文件除了特殊情況,應使用#ifdef控制塊。

 

2.4 頭文件#endif應采用行尾注釋。

 

2.5 頭文件,首先是包含代碼塊,其次是宏定義代碼塊,然后是全局變量,全局常量,類型定義,類定義,內(nèi)聯(lián)部分。

 

2.6 CPP文件,包含指令,宏定義,全局變量,函數(shù)定義。

 

3.文件結(jié)構(gòu)

 

3.1 文件應包含文件頭注釋和內(nèi)容。

 

3.2 函數(shù)體類體之間原則上用2個空行,特殊情況下可用一個或者不需要空行。

 

4.空行

 

4.1 文件頭、控制塊,#include部分、宏定義部分、class部分、全局常量部分、全局變量部分、函數(shù)和函數(shù)之間,用兩個空行。

 

二、注釋方面

1.文件頭注釋

1.1 作者,文件名稱,文件說明,生成日期(可選)

2.函數(shù)注釋

2.1 關(guān)鍵函數(shù)必須寫上注釋,說明函數(shù)的用途。

2.2 特別函數(shù)參數(shù),需要說明參數(shù)的目的,由誰負責釋放等等。

2.3 除了特別情況,注釋寫在代碼之前,不要放到代碼行之后。

2.4 對每個#else#endif給出行末注釋。

2.5 關(guān)鍵代碼注釋,包括但不限于:賦值,函數(shù)調(diào)用,表達式,分支等等。

2.6 善未實現(xiàn)完整的代碼,或者需要進一步優(yōu)化的代碼,應加上 // TODO ...

2.7 調(diào)試的代碼,加上注釋 // only for DEBUG

2.8 需要引起關(guān)注的代碼,加上注釋 // NOTE ...

2.9 對于較大的代碼塊結(jié)尾,如for,while,do等,可加上 // end for|while|do

三、命名方面

1.原則

1.1 同一性:在編寫一個子模塊或派生類的時候,要遵循其基類或整體模塊的命名風格,保持命名風格在整個模塊中的同一性。

 

1.2 標識符組成:標識符采用英文單詞或其組合,應當直觀且可以拼讀,可望文知意,用詞應當準確,避免用拼音命名。

 

1.3 最小化長度 && ***化信息量原則:在保持一個標識符意思明確的同時,應當盡量縮短其長度。

 

1.4 避免過于相似:不要出現(xiàn)僅靠大小寫區(qū)分的相似的標識符,例如"i""I","function""Function"等等。

 

1.5 避免在不同級別的作用域中重名:程序中不要出現(xiàn)名字完全相同的局部變量和全局變量,盡管兩者的作用域不同而不會發(fā)生語法錯誤,但容易使人誤解。

 

1.6 正確命名具有互斥意義的標識符:用正確的反義詞組命名具有互斥意義的標識符,如:"nMinValue" 和 "nMaxValue""GetName()" 和"SetName()" ….

 

1.7 避免名字中出現(xiàn)數(shù)字編號:盡量避免名字中出現(xiàn)數(shù)字編號,如Value1,Value2等,除非邏輯上的確需要編號。這是為了防止程序員偷懶,不肯為命名動腦筋而導致產(chǎn)生無意義的名字(因為用數(shù)字編號最省事)。

 

2.T,C,M,R類

 

2.1 T類表示簡單數(shù)據(jù)類型,不對資源擁有控制權(quán),在析構(gòu)過程中沒有釋放資源動作。

 

2.2 C表示從CBase繼承的類。該類不能從棧上定義變量,只能從堆上創(chuàng)建。

 

2.3 M表示接口類。

 

2.4 R是資源類,通常是系統(tǒng)固有類型。除了特殊情況,不應在開發(fā)代碼中出現(xiàn)R類型。

 

3.函數(shù)名

 

3.1 M類的函數(shù)名稱應采用HandleXXX命名,例如:HandleTimerEvent;不推薦采用java風格,例如 handleTimerEvent;除了標準c風格代碼,不推薦用下劃線,例如,handle_event。

 

3.2 Leave函數(shù),用后綴L。

 

3.3 Leave函數(shù),且進清除棧,用后綴LC。

 

3.4 Leave函數(shù),且刪除對象,用后綴LD。

 

4.函數(shù)參數(shù)

 

4.1 函數(shù)參數(shù)用a作為前綴。

 

4.2 避免出現(xiàn)和匈牙利混合的命名規(guī)則如apBuffer名稱。用aBuffer即可。

 

4.3 函數(shù)參數(shù)比較多時,應考慮用結(jié)構(gòu)代替。

 

4.4 如果不能避免函數(shù)參數(shù)比較多,應在排版上可考慮每個參數(shù)占用一行,參數(shù)名豎向?qū)R。

 

5.成員變量

 

5.1 成員變量用m最為前綴。

 

5.2 避免出現(xiàn)和匈牙利混合的命名規(guī)則如mpBuffer名稱。用mBuffer即可。

 

6.局部變量

 

6.1 循環(huán)變量和簡單變量采用簡單小寫字符串即可。例如,int i;

 

6.2 指針變量用p打頭,例如void* pBuffer;

 

7.全局變量

 

7.1 全局變量用g_最為前綴。

 

8.類名

 

8.1 類和對象名應是名詞。

 

8.2 實現(xiàn)行為的類成員函數(shù)名應是動詞。

 

8.3 類的存取和查詢成員函數(shù)名應是名詞或形容詞。

 

9.風格兼容性

 

9.1 對于移植的或者開源的代碼,可以沿用原有風格,不用C++的命名規(guī)范。

 

四、代碼風格方面

1.Tab和空格

1.1 每一行開始處的縮進只能用Tab,不能用空格,輸入內(nèi)容之后統(tǒng)一用空格。除了最開始的縮進控制用Tab,其他部分為了對齊,需要使用空格進行縮進。這樣可以避免在不同的編輯器下顯示不對齊的情況。

1.2 在代碼行的結(jié)尾部分不能出現(xiàn)多余的空格。

1.3 不要在"::","->","."前后加空格。

1.4 不要在",",";"之前加空格。

2.類型定義和{

2.1 類,結(jié)構(gòu),枚舉,聯(lián)合:大括號另起一行

3.函數(shù)

3.1 函數(shù)體的{需要新起一行,在{之前不能有縮進。

3.2 除了特別情況,函數(shù)體內(nèi)不能出現(xiàn)兩個空行。

3.3 除了特別情況,函數(shù)體內(nèi)不能宏定義指令。

3.4 在一個函數(shù)體內(nèi),邏揖上密切相關(guān)的語句之間不加空行,其它地方應加空行分隔。

3.5 在頭文件定義的inline函數(shù),函數(shù)之間可以不用空行,推薦用一個空行。

4.代碼塊

4.1 "if"、"for"、"while"、"do"、"try"、"catch" 等語句自占一行,執(zhí)行語句不得緊跟其后。不論執(zhí)行語句有多少都要加 "{ }" 。這樣可以防止書寫和修改代碼時出現(xiàn)失誤。

4.2 "if"、"for"、"while"、"do"、"try"、"catch" 的括號和表達式,括號可緊挨關(guān)鍵字,這樣強調(diào)的是表達式。

5.else

5.1 if語句如果有else語句,用 } else { 編寫為一行,不推薦用 3 行代碼的方式。

6.代碼行

6.1 一行代碼只做一件事情,如只定義一個變量,或只寫一條語句。這樣的代碼容易閱讀,并且方便于寫注釋。

6.2 多行變量定義,為了追求代碼排版美觀,可將變量豎向?qū)R。

6.3 代碼行***長度宜控制在一定個字符以內(nèi),能在當前屏幕內(nèi)全部可見為宜。

7.switch語句

7.1 case關(guān)鍵字應和switch對齊。

7.2 case子語句如果有變量,應用{}包含起來。

7.3 如果有并列的類似的簡單case語句,可考慮將case代碼塊寫為一行代碼。

7.4 簡單的case之間可不用空行,復雜的case之間應考慮用空行分割開。

7.5 case字語句的大括號另起一行,不要和case寫到一行。

7.6 為所有switch語句提供default分支。

7.7 若某個case不需要break一定要加注釋聲明。

8.循環(huán)

8.1 空循環(huán)可用 for( ;; ) 或者 while( 1 ) 或者 while( true )

9.類

9.1 類繼承應采用每個基類占據(jù)一行的方式。

9.2 單繼承可將基類放在類定義的同一行。如果用多行,則應用Tab縮進。

9.3 多繼承在基類比較多的情況下,應將基類分行,并采用Tab縮進對齊。

9.4 重載基類虛函數(shù),應在該組虛函數(shù)前寫注釋 // implement XXX

9.5 友元聲明放到類的末尾。

10.宏

10.1 不要用分號結(jié)束宏定義。

10.2 函數(shù)宏的每個參數(shù)都要括起來。

10.3 不帶參數(shù)的宏函數(shù)也要定義成函數(shù)形式。

11.goto

11.1 盡量不要用goto。

五、類型

  1. 定義指針和引用時*&緊跟類型。
  2. 盡量避免使用浮點數(shù),除非必須。
  3. typedef簡化程序中的復雜語法。
  4. 避免定義無名稱的類型。例如:typedef enum { EIdle, EActive } TState;
  5. 少用union,如果一定要用,則采用簡單數(shù)據(jù)類型成員。
  6. enum取代(一組相關(guān)的)常量。
  7. 不要使用魔鬼數(shù)字。
  8. 盡量用引用取代指針。
  9. 定義變量完成后立即初始化,勿等到使用時才進行。
  10. 如果有更優(yōu)雅的解決方案,不要使用強制類型轉(zhuǎn)換。

六、表達式

  1. 避免在表達式中用賦值語句。
  2. 避免對浮點類型做等于或不等于判斷。
  3. 不能將枚舉類型進行運算后再賦給枚舉變量。
  4. 在循環(huán)過程中不要修改循環(huán)計數(shù)器。
  5. 檢測空指針,用 if( p )
  6. 檢測非空指針,用 if( ! p )

七、函數(shù)

1.引用

1.1 引用類型作為返回值:函數(shù)必須返回一個存在的對象。

 

1.2 引用類型作為參數(shù):調(diào)用者必須傳遞一個存在的對象。

 

2.常量成員函數(shù)

 

2.1 表示該函數(shù)只讀取對象的內(nèi)容,不會對對象進行修改。

 

3.返回值

 

3.1 除開void函數(shù),構(gòu)造函數(shù),析構(gòu)函數(shù),其它函數(shù)必須要有返回值。

 

3.2 當函數(shù)返回引用或指針時,用文字描述其有效期。

 

4.內(nèi)聯(lián)函數(shù)

 

4.1 內(nèi)聯(lián)函數(shù)應將函數(shù)體放到類體外。

 

4.2 只有簡單的函數(shù)才有必要設計為內(nèi)聯(lián)函數(shù),復雜業(yè)務邏輯的函數(shù)不要這么做。

 

4.3 虛函數(shù)不要設計為內(nèi)聯(lián)函數(shù)。

 

5.函數(shù)參數(shù)

 

5.1 只讀取該參數(shù)的內(nèi)容,不對其內(nèi)容做修改,用常量引用。

 

5.2 修改參數(shù)內(nèi)容,或需要通過參數(shù)返回,用非常量應用。

 

5.3 簡單數(shù)據(jù)類型用傳值方式。

 

5.4 復雜數(shù)據(jù)類型用引用或指針方式。

 

八、類

1.構(gòu)造函數(shù)

1.1 構(gòu)造函數(shù)的初始化列表,應和類的順序一致。

1.2 初始化列表中的每個項,應獨占一行。

1.3 避免出現(xiàn)用一個成員初始化另一個成員。

1.4 構(gòu)造函數(shù)應初始化所有成員,尤其是指針。

1.5 不要在構(gòu)造函數(shù)和析構(gòu)函數(shù)中拋出異常。

2.純虛函數(shù)

2.1 M類的虛函數(shù)應設計為純虛函數(shù)。

3.構(gòu)造和析構(gòu)函數(shù)

3.1 如果類可以繼承,則應將類析構(gòu)函數(shù)設計為虛函數(shù)。

3.2 如果類不允許繼承,則應將類析構(gòu)函數(shù)設計為非虛函數(shù)。

3.3 如果類不能被復制,則應將拷貝構(gòu)造函數(shù)和賦值運算符設計為私有的。

3.4 如果為類設計了構(gòu)造函數(shù),則應有析構(gòu)函數(shù)。

4.成員變量

4.1 盡量避免使用mutableVolatile。

4.2 盡量避免使用公有成員變量。

5.成員函數(shù)

5.1 努力使類的接口少而完備。

5.2 盡量使用常成員函數(shù)代替非常成員函數(shù),const函數(shù)

5.3 除非特別理由,絕不要重新定義(繼承來的)非虛函數(shù)。(這樣是覆蓋,基類的某些屬性無初始化)

6.繼承

6.1 繼承必須滿足IS-A的關(guān)系,HAS-A應采用包含。

6.2 虛函數(shù)不要采用默認參數(shù)。

6.3 除非特別需要,應避免設計大而全的虛函數(shù),虛函數(shù)功能要單一。

6.4 除非特別需要,避免將基類強制轉(zhuǎn)換成派生類。

7.友元

7.1 盡量避免使用友元函數(shù)和友元類。

九、錯誤處理

  1. 申請內(nèi)存用new操作符。
  2. 釋放內(nèi)存用delete操作符。
  3. newdelete,new[]delete[]成對使用。
  4. 申請內(nèi)存完成之后,要檢測指針是否申請成功,處理申請失敗的情況。
  5. 誰申請誰釋放。優(yōu)先級:函數(shù)層面,類層面,模塊層面。
  6. 釋放內(nèi)存完成后將指針賦空,避免出現(xiàn)野指針。
  7. 使用指針前進行判斷合法性,應考慮到為空的情況的處理。
  8. 使用數(shù)組時,應先判斷索引的有效性,處理無效的索引的情況。
  9. 代碼不能出現(xiàn)編譯警告。
  10. 使用錯誤傳遞的錯誤處理思想。
  11. 衛(wèi)句風格:先處理所有可能發(fā)生錯誤的情況,再處理正常情況。
  12. 嵌套do-while(0)宏:目的是將一組語句變成一個語句,避免被其他if等中斷。

十、性能

  1. 使用前向聲明代替#include指令。Class M;
  2. 盡量用++i代替i++。即用前綴代替后綴運算。
  3. 盡量在for循環(huán)之前,先寫計算估值表達式。
  4. 盡量避免在循環(huán)體內(nèi)部定義對象。
  5. 避免對象拷貝,尤其是代價很高的對象拷貝。
  6. 避免生成臨時對象,尤其是大的臨時對象。
  7. 注意大尺寸對象數(shù)組。
  8. 80-20原則。

十一、兼容性

  1. 遵守ANSI C和ISO C++國際標準。
  2. 確保類型轉(zhuǎn)換不會丟失信息。
  3. 注意雙字節(jié)字符的兼容性。
  4. 注意運算溢出問題。
  5. 不要假設類型的存儲尺寸。
  6. 不要假設表達式的運算順序。
  7. 不要假設函數(shù)參數(shù)的計算順序。
  8. 不要假設不同源文件中靜態(tài)或全局變量的初始化順序。
  9. 不要依賴編譯器基于實現(xiàn)、未明確或未定義的功能。
  10. 將所有#include的文件名視為大小寫敏感。
  11. 避免使用全局變量、靜態(tài)變量、函數(shù)靜態(tài)變量、類靜態(tài)變量。在使用靜態(tài)庫,動態(tài)庫,多線程環(huán)境時,會導致兼容性問題。
  12. 不要重新實現(xiàn)標準庫函數(shù),如STL已經(jīng)存在的。

 

責任編輯:王雪燕 來源: liyuefeilong的專欄
相關(guān)推薦

2011-07-20 16:16:03

CC++

2009-05-22 11:01:53

C++JavaC#

2018-12-25 23:10:11

框架C++

2009-08-26 10:09:22

C#編碼規(guī)范

2011-08-04 09:35:09

Objective-C 編碼規(guī)范

2017-03-29 09:08:25

Spring筆記

2010-01-14 09:27:44

C++語言

2009-09-08 17:37:54

C# listbox控

2009-08-21 08:52:40

C#語言命名

2010-01-22 16:35:41

C++開發(fā)

2010-01-25 11:21:01

C++語法

2010-01-26 17:11:13

C++編程

2011-06-21 10:00:21

預處理指令

2010-01-25 13:43:09

C++算術(shù)編碼

2013-05-27 14:06:14

Android開發(fā)移動開發(fā)Intent機制

2015-12-16 10:30:18

前端開發(fā)指南

2024-09-04 09:43:36

2024-07-26 10:35:00

2017-12-09 21:08:35

C++人工智能機器學習

2010-01-26 13:14:48

點贊
收藏

51CTO技術(shù)棧公眾號