C++編碼規(guī)范資料_第1頁
C++編碼規(guī)范資料_第2頁
C++編碼規(guī)范資料_第3頁
C++編碼規(guī)范資料_第4頁
C++編碼規(guī)范資料_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

北京四方繼保自動化

股份有限公司

作業(yè)指導書

文件名稱:C++編碼規(guī)范

文件編號:SF-研發(fā)中心-0X00

編制日期

審核日期

批準日期

L目的

良好的編程風格是提高程序可靠性非常重要的手段,也是在大的軟件項目中

多人合作開發(fā)的基礎。為了提高我公司C++源程序的質量和可維護性,通過

本規(guī)范定義來規(guī)避不好的編程風格,增強代碼的可讀性與可維護性,以便于

自己和他人閱讀。

2.適用范圍

本規(guī)范適用于軟件開發(fā)中心所開發(fā)的后臺軟件、主站系統(tǒng)平臺及應用軟件的

C++編碼。

3.職責

編碼人員:遵照本編碼規(guī)范進行代碼編寫。

代碼審查人員:執(zhí)行代碼走查,確認實際代碼與編碼規(guī)范的符合性。

4.相關文件

《高質量C++編程指南》

《軟件中心源代碼編制規(guī)范》

《C&C++編程規(guī)范》

《ZDH2004101401-自動化室編程規(guī)范(C及C++部分)》

《軟件中心源代碼編制規(guī)范》

5.定義

6.編碼規(guī)范

第一章概述

1.1前言

為了保證軟件程序的質量,提高程序的可維護性和可測試性,特制定本C++編程規(guī)范。

本規(guī)范主要規(guī)定了公司軟件研發(fā)中心C++程序的編碼內(nèi)容及規(guī)則,適用于公司所有使用

C++語言開發(fā)的高級應用軟件模塊和軟件產(chǎn)品。

本規(guī)范中的舉例,只是針對具體的某一條規(guī)范而加以說明,有可能并不符合其他的規(guī)范,

例如變量定義的舉例,對變量的定義做了說明,但在規(guī)范的其它舉例中,并沒有使用規(guī)定的

定義方法,請使用者加以注意。

規(guī)范中的某些內(nèi)容是屬于必須執(zhí)行的,標有【規(guī)范】字樣;某些內(nèi)容是屬于建議性的,

標有【建議】字樣。

1.2規(guī)范制定原則

?方便代碼的交流和維護。

?只規(guī)定需要規(guī)定的事情,不要強制施加個人喜好或者過時的做法。

?不影響編碼的效率,不與大眾習慣沖突。

?使代碼更加美觀、閱讀更為方便。

?正確、簡單和清晰第一,堅持KISS(KeepItSimpleSoftware)原則。

?使代碼的邏輯更清晰、更易于理解。

第二章文件結構

2.1文件名命名

文件名由基本名和后綴名構成,基本名由不大于8個的字母和數(shù)字組成,僅允許用

小寫字母且以字母開頭,基本名應是有意義的名字,應與程序功能相一致。后綴名由不

超過3個字符組成,常見后綴要求如下:

name.hC++headerfile

name.cppC++sourcefile

name.incIncludefile

namc.defDefinition(Declaration)file

name.cfgCompiledeclarationfile

注意:嚴禁使用中文命名文件名。

2.2程序文件內(nèi)容

2.2.1源程序文件內(nèi)容

完整的程序文件由若干部分內(nèi)容構成,各部分內(nèi)容及一般順序如下:

a)文件頭部注釋

說明該文件模塊的功能和內(nèi)容(函數(shù)、外部數(shù)據(jù)說明等工應列出版本號,生成

日期,作者,主要函數(shù)及其功能,修改日志等。

b)各種定義及類型定義

Defines和typedefs,其順序為:

“constant“macro

“function“macro

typedefs

enums

0全局(外部)數(shù)據(jù)說明

Global(external)datadeclarations,其順序為:

extems

non-staticglobals

staticglobals

如果一組defines僅應用于某一特定的全局數(shù)據(jù)塊(如標志字),則該defines

應緊跟在此數(shù)據(jù)說明之后,或嵌入到結構說明之中。

d)函數(shù)模塊

功能類似的函數(shù)應盡量放在一起,每一函數(shù)之前應有函數(shù)頭部注釋,主要提供

函數(shù)的接口說明,內(nèi)容包括函數(shù)基本功能描述、出入口參數(shù)、調用關系,必要時

也應包括實現(xiàn)算法。

函數(shù)體中,根據(jù)需要可有代碼塊注釋,它可對某個代碼塊的功能、編程技巧及

臨時變量進行說明。

2.2.2頭文件內(nèi)容

頭文件中一般允許放下列內(nèi)容:

,宏定義

?各種數(shù)據(jù)結構說明

?typedefs說明

?外部函數(shù)說明

?全局變量說明

【規(guī)范2.1】頭文件(*.h文件)的開始代碼部分,一定要加上ifndef/define/endif等

預編譯判斷條件,防止頭文件被重復包含。

【規(guī)范2.2]用#include<filename.h>格式來引用標準庫的頭文件(編譯器將從標準

庫目錄開始搜索)。

【規(guī)范2.3】用#include“filename.h”格式來引用自定義/非標準庫的頭文件(編譯

器將從用戶的工作目錄或者指定的路徑開始搜索

【規(guī)范2.4】頭文件名不應與標準函數(shù)庫名相同。

【規(guī)范2.5】頭文件中只應包括多個文件都需要的內(nèi)容。對于功能不同的內(nèi)容應放在不同

的頭文件中。

【規(guī)范2.6]如果源文件的個數(shù)比較多(超過10個),應該根據(jù)軟件需要/功能劃分將源

文件保存在不同的路徑下,如下圖所示。

頭文件保存在include目錄,程序文件保存在source或者src目錄(可以

根據(jù)需要設置為多級目錄),資源文件保存在res目錄,執(zhí)行文件保存在bin目錄,LIB庫

文件保存在lib目錄,如果有配置文件可以保存在config目錄。

對于某個程序文件所私有的頭文件,沒有必要公開“聲明”。為了加強信息

隱藏,這些私有的頭文件可以存放于定義文件的子目錄下,如"private/nameP.h”。

工程目錄的各級子目錄可以根據(jù)某種標準細分為各類子目錄,每個子目錄都

應該包含一個readme文件。readme文件應該列舉目錄中包含的子文件及其主要作用說明。

4]如果有需要,可以增加其他目錄如tmp等等,但建議基本結構不變。

義2.5J在頭文件中只存放“聲明”而不存放“定義”。

#include中不能包括全路徑,盡量采用相對路徑。

給自己的工程一個簡短的編碼代號如CSFM、CSM等,小組可以統(tǒng)一使用它做

代碼命名前綴。

第三章排版規(guī)則

【規(guī)范3.1】在一個函數(shù)體內(nèi),邏揖上密切相關的語句之間不加空行,其它地方應加空行

分隔。相對獨立的程序塊之間,變量說明之后必須加空行.

【示例】

〃空行

voidfunctionl()

(

〃空行

while(condition)

{

statement1;

//空行

if(condition)

(

statement2;

}

else

(

statements:

)

//空行

statement4;

)

)

〃空行

【規(guī)范3.2〕變量和運算符間要留有空隙,用一個空格符隔開,便于閱讀。當然,特殊的

單目運算符等除外,如“()”及作為指針運算符使用時的函數(shù)定

義和調用中若出現(xiàn)多個參數(shù),前一參數(shù)后應緊跟逗號運算符,并用一個空格符與后面參數(shù)

隔開。

【示例】

inti=0;/*正確*/

inti=0;/*錯誤*/

a=b*c:/*正確*/

a=b*c;/*錯誤*/

if((a==b)&&(a!=c))/*正確*/

if((a==b)&&(a!=c))/*錯誤*/

fuc(a,b,c,d)/*正確*/

fuc(a,b,c,d)/*錯誤*/

for(i=0:i<10;i++)/*正確*/

for(i=0;i<10;i++)/*錯誤*/

pPointer->a=pPointer->b*pPointer->c/*正確*/

pPointer->a=pPointer->b*pPointer->c/*錯誤*/

int*pX=&i,y;/*正確,此處y不會被誤解為指針*/

int*pX=&i,y;/*錯誤*/

【規(guī)范3.3】一行代碼只做一件事情,如只定義一個變量,或只寫一條語句。這樣的代碼

容易閱讀,并且方便于寫注釋。

【示例】

如下例子不符合規(guī)范

rect.length=0;rect.width=0;

應如下書寫

rect.length=0;

rect.width=0;

【規(guī)范3.4】if、for>while,do等語句自占一行,除只有一條語句外,執(zhí)行語句不得緊

跟其后,并加{鼠這樣可以防止書寫失誤。但要求do…while。結構語句的while子句與}

同行且緊跟其后,以區(qū)別于while。結構語句。

【示例】

示例:如下例子不符合規(guī)范。

if(pUserCR==NULL)return;

do{}

while(pUserCR==NULL)

應如下書寫:

if(pUserCR==NULL)

(

return;

)

do

(

}while(pUserCR==NULL);

【規(guī)范3.5】程序的分界符'{'和'}'應獨占一行并且位于同一列,同時與引用它們的

語句左對齊。

【規(guī)范3.6]{}之內(nèi)的代碼塊在“{"右邊數(shù)格處左對齊。如果出現(xiàn)嵌套的{),則使用

縮進對齊。

【規(guī)范3.7】使用4字符長度的縮進風格,而且最好使用tab鍵縮進代碼。將tab設為4

字符長。

【規(guī)范3.81代碼行最大長度宜控制在70至80個字符以內(nèi)。

【規(guī)范3.9】長表達式要在低優(yōu)先級操作符處拆分成新行,操作符放在新行之首(以便突

出操作符)。拆分出的新行要進行適當?shù)目s進,使排版整齊,語句可讀。

【示例】

if((very_1onger_variab1e1>=very_1onger_variab1e12)

&&(very_1onger_variab1e3<=very_longer_variablel4)

&&(very_longer_variable5<=very_longer_variablel6))

【規(guī)范3.10】應當將修飾符*和&緊靠變量名.

【示例】

char*naroe:

int*x,y:/*此處y不會被誤解為指針。*/

【規(guī)范3.11]關鍵字之后要留空格。象const、case等關鍵字之后至少要留一個空格,

否則無法辨析關鍵字。象if、for、while等關鍵字之后應留一個空格再跟左括號“(”,以

突出關鍵字。

【規(guī)范3.12】函數(shù)名之后不要留空格,緊跟左括號“(”,以與關鍵字區(qū)別。

【規(guī)范3.13]“(”向后緊跟,向前緊跟,緊跟處不留空格。

【規(guī)范3.14]“,”之后要留空格,如FunctionG,y,z)0如果“;”不是一行的結束符

號,其后要留空格,如for(initialization;condition;update)?

【規(guī)范3.15]“賦值操作符、比較操作符、算術操作符、邏輯操作符、位域操作符,如“=”、

“+=,,、“>="、“<="、“+”、“*”、“%”、“皿,”||”、等二元操作符的前后應當

加空格。

【規(guī)范3.16】一元操作符如“一”、(地址運算符)等前后不加空

格。

【規(guī)范3.17]象這類操作符前后不加空格。

【規(guī)范3.18】對于表達式比較長的for語句和if語句,為了緊湊起見可以適當?shù)厝サ粢?/p>

些空格,如for(i=0;i<10;i+-)和if((a<=b)&&(c<=d))。

【示例】

voidFund(intx,inty,intz):/?良好的風格*/

voidFund(intx,inty,intz);/*不良的風格*/

If(year>=2000)/*良好的風格*/

if(year>=2000)/*不良的風格*/

if((a>=b)&&(c<=d))/*良好的風格*/

if(a>=b&&c<=d)/*不良的風格*/

for(i=0;i<10;i++)/*良好的風格*/

for(i=0;i<10;i++)/*不良的風格*/

for(i=0;I<10;i++)/*過多的空格*/

x=a<b?a:b;/*良好的風格*/

x=a<b?a:b:/*不好的風格*/

int*x=&y;/*良好的風格*/

int*x=&y;/*不良的風格*/

array[5]=0;/*不要寫成array[5]=0;*/

a.Function0;/*不要寫成a.FunctionO;*/

b->Function();/*不要寫成b->FunctionO:*/

【規(guī)范3.19】左括號“(”不要緊靠關鍵字,中間用一個空格隔開。

【規(guī)范3.20]左括號“(”與方法名之間不要添加任何空格。

【規(guī)范3.21】沒有必要的話不要在返回語句中使用()。

上述三規(guī)范舉例如下:

【示例】

if(condition)

Array.Remove(1);

return1;

【規(guī)范3.22】左花括號“{"放于關鍵字或方法名的下一行并與之對齊。

【規(guī)范3.23】左花括號“{”要與相應的右花括號對齊。

【規(guī)范3.24】通常情況下左花括號“{”單獨成行,不與任何語句并列一行。

【規(guī)范3.25】if、while、do語句后一定要使用{},即使{}號中為空或只有一條語句。

盡可能在定義變量的同時初始化該變量(就近原則)。

【示例】

voidfunction()

(

inti=0;/**/(注釋)

intilntID=-1;/**/(注釋)

for(i=0;i<10;i++)

(

if(ilntID<0)

{

break;

)

】右花括號“}”后建議加一個注釋以便于方便的找到與之相應的

【示例】

while(1)

(

if(valid)

{

}/?ifvalid*/

else

}/*notvalid*/

}/*endforever*/

第四章代碼注釋

軟件中心開發(fā)人員所編制的所有源代碼應有良好注釋。最好為英文注釋。

【規(guī)范4.1】注釋應當準確、易懂,防止注釋有二義性,注釋率達到20%以上。其中多行

注釋以/*……*/結構,單行以〃結構。

【規(guī)范4.2】對于主要的宏、常量、結構,在定義時需要加注釋。

【規(guī)范4.3】全局變量要有較詳細的注釋,包括對其功能、取值范圍、存取時注意事項等

的說明。

【規(guī)范4.4】重要循環(huán)和條件語句一般要寫注釋,注釋放在這段代碼之前,同時要保持相

同的層次感。典型的算法要編寫注釋,說明算法的原理、使用的公式、必要時列出參考書

籍。

【規(guī)范4.51頭文件的注釋,采用如下格式:

/***********************************************************

*Copyright(C)200X-200X北京四方繼保自動化股份有限公司/部門

*Allrightsreserved.

*

*文件名稱:filename.h

*摘要:功能概述

*當前版本:<新版本號"〈完成日期****-**-**>,〈作者/修改者姓名>,<修改概述)

*

*歷史記錄:〈舊版本號),〈完成日期****-**-**>,<作者/修改者姓名>,<修改概述)

*V2.0,2004-12-10,張王李,添加函數(shù)funcA

*??????

*

************************************************************/

#ifndef_INC_FILENAME〃預編譯,防止頭文件被重復引用

#defineINCFILENANE

^include<iostream.h>〃標準庫的頭文件

Sinclude"dbType.h"〃自定義的非標準庫工程通用頭文件

Sinclude"rtuType.h"〃自定義的非標準庫本地頭文件

#definePI3.1415926〃宏定義(如不得已而需要的話)

structStructName〃結構聲明(或typedef形式聲明)

(

);

//FORWARDREFERENCES〃引用原型聲明等(函數(shù)需功能概述)

classXX

public:〃類聲明,注意順序,先函數(shù)再數(shù)據(jù)

protected:

private:

};

//INLINEMETHODS〃內(nèi)城函數(shù)

voidFunctionName();

//EXTERNALREFERENCES〃外部引用說明

#endif

【規(guī)范4.6】程序文件的注釋,采用如下格式:

/********************************************************************

*Copyright(C)200X-200X北京四方繼保自動化股份有限公司/部門

*Allrightsreserved.

*

*文件名稱:filename.cpp(或filename,c)

*摘要:功能概述

*當前版本:<新版本號>,<完成口期****-**-**>,<作者/修改者姓名>,<修改概述)

*

*歷史記錄:〈舊版本號>,<完成日期****-**-**>,<作者/修改者姓名〉,〈修改概述〉

*V2.0,2004-12-10,張王李,添加函數(shù)funcA

*???

*

*************************************************************料*****/

〃引用頭文件

^include"sysPipe.h"〃其它模塊頭文件

Sinclude"sysKrnl.h"〃本模塊頭文件,即本模塊需要輸出的函數(shù)和變量聲明

〃全局變量定義供所有模塊引用

intsysBook:

〃本地變量定義

staticintgFlag:

〃本地函數(shù)前置聲明

staticvoidLoca1FunctionName(??,)

〃注:當上面的“本地變量定義”和“本地函數(shù)前置聲明”內(nèi)容較多時應將上述內(nèi)容放

到private目錄下的“本文件名P.h”,即“sysKrnlP.h”頭文件中,并在此處引用,如:

^includertprivate/sysKrnlP.hw

intmain(intargc,char*argv[])〃主函數(shù)代碼

(

)

voidsysFunctionName()〃全局函數(shù)代碼

(

)

voidLoca1FunctionName()〃局部函數(shù)代碼

}

【規(guī)范4.7】函數(shù)的注釋,采用如下格式:

/?

*函數(shù)名稱:

*函數(shù)功能:

*函數(shù)入口:

*輸入?yún)?shù):

*輸出參數(shù):

*返回值:

*其它說明:

*/

intFunctionName(intargl,??,)

(

)

【規(guī)范4.8】盡量避免在注釋中使用縮寫,特別是不常用縮寫。

【規(guī)范4.9】注釋的位置應與被描述的代碼相鄰,可以放在代碼的上方或右方,不可放在

下方。

【規(guī)范4.10]注釋語言用中、英文兼有,建議多使用中文。嚴禁英文和拼音混用。在使

用中文時,必須用/**/注釋,且*與注釋之間留有空格。

使用良好一致的注釋風格,大段注釋使用如下格式。除首末行外每行頂頭

用"*”標注.

【示例】

/*

*Thisisthecorrectformatforamultilinecomment

*inasectionofcede.

*

*/

使用固定的注釋提示:

【示例】

TBD:tobedone

BUG:表明BUG的存在

LIMITATION:程序的限制

BUGFIX:修復BUG記錄

DEBUG:表明所加代碼是為了尋找BIG

TRICKY:表明緊隨的代碼比較敏感,修改要謹慎

WARNING:警示

COMPILER:表明是為了避免編譯器的BLG

KLUDGE:表明這段代碼寫的并不明智

對于一段非常龐大的代碼體(比如函數(shù)),在其結尾處放置一個識別注釋很

有好處。

【示例】

voidfoo()

(

averyverylongfunctionboby

}/*foo*/

用可視的分隔符將相互關聯(lián)的函數(shù)成組。

【示例】

voidfoo()

(

)

/************************************

voidbar()

在一個文件中宏、結構、變量、函數(shù)等聲明/定義都放在一起,并且在之前

加上注釋表明其內(nèi)容。

【示例】

/*

*以下為宏定義

*/

Sdefine/*注釋*/

/*

*以下為結構體定義

*/

typedefstruct/*注釋*/

/*注釋*/

}StructName;

/?

*以下為全局變量聲明

*/

第五章命名規(guī)則

【規(guī)范5.1]采用大寫字母慣例(駱駝式),組成標識符的各個單詞以大寫字母打頭,然

后聯(lián)接起來,同時有一個匈牙利式的前綴。

【規(guī)范5.2】程序中不要出現(xiàn)僅靠大小寫區(qū)分的相似的標識符。

【示例】

intx,X;/*變量):與X容易混淆*/

【規(guī)范5.3】程序中不要出現(xiàn)標識符完全相同的局部變量和全局變量,盡管兩者的作用域

不同而不會發(fā)生語法錯誤,但會使人誤解。

【規(guī)范5.4】盡量避免名字中出現(xiàn)數(shù)字編號(標號除外),如Valuel,Vahie2等,除非邏輯

上的確需要編號。

【示例】

如下命名,使人產(chǎn)生疑惑。

#define_EXAMPLE_O_TEST_

^define_EXAMPLE_1_TEST_

voidset_sls00(BYTEsis):

應改為有意義的單詞命名

#define_EXAMPLE_UNIT_TEST_

"defineEXAMPLEASSERTTEST

voidset_udt_msg_sls(BYTEsis);

【規(guī)范5.5】標識符應當直觀且可以拼讀,可望文知意,不必進行“解碼

【規(guī)范5.6】標識符最好采用英文單詞或其組合,便于記憶和閱讀。切忌使用漢語拼音來

命名。程序中的英文單詞一般不會太復雜,用詞應當準確。例如不要把CurrentValue寫成

NowValueo

【規(guī)范5.7】命名長度大致為8~30個字符,使用恰當?shù)目s寫。

【示例】

縮寫的三種方法:

抽取元音字母

task—>tsk

user->usr

取單詞意義明顯的頭部

maximum->max

minimum->min

register—>reg

慣例,實際上是先用(2)后用(1)進行處理而得

temporary->tmp

remove->rm

【規(guī)范5.8】關于命名縮寫,只有一個限制:如果縮寫導致該名字的意義不明確,就不要

使用它。

【規(guī)范5.9】用全部的大寫字母加下劃線來命名預處理的宏。

【規(guī)范5.10]函數(shù)應采用動賓結構命名,以動詞開頭,后跟一個名詞,如:Void

ResetCounter(Void)。

【規(guī)范5.11]變量的名字應當使用“名詞”或者“形容詞+名詞:

【示例】

intvalue;

intoldValue;

【規(guī)范5.12】局部變量采用短名字。

【規(guī)范5.13]標號名仍采用大寫字母慣例,由三部分組成,第一部分為與本模塊函數(shù)功

能一致的從屬名,第二部分為描述性字符,第三部分為數(shù)字序號。

【規(guī)范5.14]標識符中的所有字母都大寫。僅對于由兩個或者更少字母組成的標識符使

用該約定。

【示例】

System.10

System.Web.UI

【規(guī)范5.15】不要將縮寫或縮略形式用作標識符名稱的組成部分。例如,使用GetWindow,

而不要使用GetWino

【規(guī)范5.16]不要使用計算機及本專業(yè)領域中未被普遍接受的縮寫。

【規(guī)范5.17]在使用縮寫時,對于超過兩個字符長度的縮寫請使用Pascal大小寫或

Camel大小寫。例如,使用HtmlButton或htmlButton<>但是,應當大寫僅有兩個字符的

縮寫,如,System.10,而不是System.Io<>

【規(guī)范5.18】所有單詞大寫,多個單詞之間用V隔開。

f示例i

conststringPAGE_TITLE="Welcome”;

【規(guī)范5.19】類名用大寫字母開頭的單詞組合而成。

【規(guī)范5.20)子程序名遵循模塊-名詞-動詞的規(guī)則,首先是模塊名前綴,然后是該程序

要處理的東西或對象的名字,最后是該程序要使用的動作。

【示例】

fooObjFindfoo-object-find

sysNvRamGetsystem-NVRAM-get

taskSwitchHookAddtask-switchhook-add

避免容易被主觀解釋的難懂的名稱,如方面名Anal^eThisO,或者屬性名

xxK8o這樣的名稱會導致多義性。

]只要合適,在變量名的末尾或開頭加計算限定符(Avg、Sum、Min、Max、

Index)。

【示例】

舉例:u8FrmSum;/*報文校驗和*/

在變量名中使用互補對,如min/max、begin/end和open/close。

布爾變量名應該包含Is,這意味著Yes/No或True/False值,例如

fildsFoundo

即使對于可能僅出現(xiàn)在幾個代碼行中的生存期很短的變量,仍然使用有意義

的名稱。僅對于短循環(huán)索引使用單字母變量名,如i或j??赡艿那闆r下,盡量不要使

用原義數(shù)字或原義字符串.

說明:如Fori=1To7o而是使用命名常數(shù),如Fori=1ToNUM_DAYS_IN_WEEK以

便于維護和理解。

6]除非必要,不要用數(shù)字或較奇怪的字符來定義標識符。

用正確的反義詞組命名具有互斥意義的變量或相反動作的函數(shù)等。

r說而

下面是一些在軟件中常用的反義詞組:

add/removebegin/endcreate/destroy

insert/deletefirst/lastget/release

increment/decrementput/get

add/deletelock/unlockopen/close

min/maxold/newstart/stop

next/previoussource/targetshow/hide

send/receivesource/destination

cut/pasteup/dcwn

【示例】

intmin_sum;

intmaxsum;

intadd_user(BYTE*user_name);

intdeleteuser(BYTE*username):

第六章表達式和基本語句

【規(guī)范6.1】如果代碼行中的運算符比較多,用括號確定表達式的操作順序,避免使用默

認的優(yōu)先級,應當用括號確定表達式的操作順序。

【規(guī)范6.2】不要編寫太復雜的復合表達式。

【規(guī)范6.3]在混合精度的表達式中應該使用同一精度的數(shù)據(jù)類型進行計算。

【規(guī)范6.4】不可將布爾變量直接與TRUE、FALSE或者1、0進行比較。

【示例】

布爾測試

intx=1:

if(x==0)〃寫法正確

if(!x)〃寫法錯誤

BOOLb=TRUE;

if(b==0)〃寫法錯誤

if(!b)〃寫法正確

【規(guī)范6.5]應當將整型變量用“=="或“!=”直接與0比較。

【規(guī)范6.6]不可將浮點變量用“=="或"!=”與任何數(shù)字比較。

【規(guī)范6.7]應當將指針變量用“=="或"!=”與NULL比較。

【規(guī)范6.8】不可在for循環(huán)體內(nèi)修改循環(huán)變量,防止for循環(huán)失去控制。

【規(guī)范6.9]每個case語句的結尾不要忘了加break,否則將導致多個分支重疊(除非

有意使多個分支重疊Switch語句要有CASE配合。

【示例】

switch(variable)

I

casevalue1:…

break;

casevalue2:

break;

default:???

break;

}

【規(guī)范6.10】不要忘記最后那個default分支。即使程序真的不需要default處理,也

應該保留語句default:breako

【規(guī)范6.11】循環(huán)、分支層次一般不要超過五層。

goto的使用:原見上盡量避免,主要用于從深層代碼中快速跳出。

]if(1=variableA)之類的寫法雖然可以避免犯一些錯誤,但不符合人的

閱讀習慣,不推薦使用。

文6.3避免使用register關鍵字聲明變量。

【建議6.4】少用三元操作符?:。

盡量使用含義直觀的常量來表示那些將在程序中多次出現(xiàn)的數(shù)字或字符串。

第七章函數(shù)設計

【規(guī)范7.1】函數(shù)的規(guī)模盡量控制在100行之內(nèi)(不包括空行和注釋)。

【規(guī)范7.2】一個函數(shù)只完成一項功能。

【規(guī)范7.3】參數(shù)的書寫要完整,不要貪圖省事只寫參數(shù)的類型而省略參數(shù)名字。如果函

數(shù)沒有參數(shù),則用void填充。

【規(guī)范7.4】如果參數(shù)是指針,且僅作輸入用,則應在類型前加const,以防止該指針在

函數(shù)體內(nèi)被意外修改。

【規(guī)范7.5】不要省略返回值的類型。如果沒有返回值,應該聲明為void類型。

【示例】

應當寫成:

voidGetChild(intiParentNode,intiLevel):

不要寫成:

GetChild(int,int):

應當寫成:

intSetMode(void);

不要寫成:

intSetMode();

【規(guī)范7.6】在函數(shù)的“入口處”,需要檢查參數(shù)的有效性。

【規(guī)范7.7】檢查通過其它途徑進入函數(shù)的變量的有效性,如:全局變量、句柄等。

【規(guī)范7.8]函數(shù)參數(shù)盡量使用C++的const機制保證數(shù)據(jù)安全性;盡量不要使用類型和

數(shù)目不確定的參數(shù),如C語言的printf函數(shù)是采用不確定類型和參數(shù)數(shù)目的典型代表,提

倡使用C++的I/O機制,因其是類型安全的。

【規(guī)范7.9]在C++中,指針的使用應慎重,如果的確只需要借用一下對象的“別名”,提

倡使用CH■的引用機制,不使用指針。

【規(guī)范7.10】不要引用未經(jīng)賦值的指針,因為這樣常常會引起系統(tǒng)的崩潰。

【規(guī)范7.11]Return語句不可返回指向“棧內(nèi)存”的“指針”或“引用”,因為該內(nèi)存在

函數(shù)體結束時被自動銷毀。

【規(guī)范7.12】一個函數(shù)中不能聲明另外一個函數(shù)。

1盡量避免函數(shù)的參數(shù)過多,參數(shù)個數(shù)最好不超過5個。如果參數(shù)太多,使用

時容易將相同數(shù)據(jù)類型的參數(shù)順序用錯??梢越o一些參數(shù)提供適當默認值減輕用戶的調用

負擔。

用于出錯處理的返回值一定要清楚,讓使用者不容易忽視或誤解錯誤情況。

不要將正常值和錯誤標志混在一起返回。正常值用輸出參數(shù)獲得,而錯誤標

志用return語句返回。

使用靈活的、動態(tài)分配的數(shù)據(jù),不要使用固定大小的數(shù)組。

Z7.5在多任務操作系統(tǒng)的環(huán)境下編程,要注意函數(shù)可重入性。

第八章變量、結構

【規(guī)范8.1]仔細定義并明確公共變量的含義、作用、取值范圍及公共變量間的關系。明

確公共變量與操作此公共變量的函數(shù)或過程的關系(如訪問、修改及創(chuàng)建等)。

【規(guī)范8.2】防止局部變量與公共變量同名。防止多個不同模塊或函數(shù)都可以修改、創(chuàng)建

同一公共變量的現(xiàn)象。

【規(guī)范8.3】當向公共變量傳遞數(shù)據(jù)時,要十分小心,防止賦與不合理的值或越界等現(xiàn)象

發(fā)生。

說明:對公共變量賦值時,若有必要應進行合法性檢查,以提高代碼的可靠性、穩(wěn)定性。

【規(guī)范8.4】使用嚴格形式定義的、可移植的數(shù)據(jù)類型,盡量不要使用與具體硬件或軟件

環(huán)境關系密切的變量。

【規(guī)范8.5】結構的設計要盡量考慮向前兼容和以后的版本升級,并為某些未來可能的應

用保留余地(如預留一些空間等)。

【規(guī)范8.6】合理地設計數(shù)據(jù)并使用自定義數(shù)據(jù)類型,避免數(shù)據(jù)間進行不必要的類型轉換。

【規(guī)范8.7】常量用全大寫字母、下劃線分割單詞的方式表達。

【示例】

常量命名

defineMAX_LENGTH100(不推薦)

constintMAX_WIDTH=1024(推薦)

使用嚴格形式定義的、可移植的數(shù)據(jù)類型,盡量不要使用與具體硬件或軟件

環(huán)境關系密切的變量。

說明:使用標準的數(shù)據(jù)類型,有利于程序的移植。

對編譯系統(tǒng)默認的數(shù)據(jù)類型轉換,也要有充分的認識。

【示例】

如下賦值,多數(shù)編譯器不產(chǎn)生告警,但值的含義還是稍有變化。

charchr;

unsignedshortintexam:

chr=-1;

exam=chr;/*編譯器不產(chǎn)生告警,此時exam為OxFFFF。?/

盡量減少沒有必要的數(shù)據(jù)類型默認轉換與強制轉換。

第九章宏

【規(guī)范9.1】用宏定義表達式時,要使用完備的括號。

【示例】

如下定義的宏都存在一定的風險,

itdefineRECTANGLEAREA(a,b)a?b

itdefineRECTANGLE_AREA(a,b)(a*b)

#defineRECTANGLE」\REA(a,b)(a)*(b)

正確的定義應為:

★defineRECTANGLE_AREA(a,t)((a)*(b))

【規(guī)范9.2】將宏所定義的多條表達式放在大括號中。

【示例】

下面的語句只有宏的第一條表達式被執(zhí)行。為了說明問題,for語句的書寫稍不符規(guī)范。

itdefineINTI_RECT_VALUE(a,b)\

a=0:\

b=0;

for(index=0;index<RECT_TOTAI._NUM;index++)

INTI_RECT_VALUE(rect.a,rect.b);

正確的用法應為:

mdefineINTI_RECT_VALUE(a,b)\

(\

a=0:\

b=0;\

)

for(index=0;index<RECT_TOTAL_NUM;index++)

(

INTI_RECT_VALUE(rect[index].a,rect[index].b);

}

【規(guī)范9.3】使用宏時,不允許參數(shù)發(fā)生變化。

【示例】

如下用法可能導致錯誤。

^defineSQUARE(a)((a)*(a))

inta=5;

intb;

b=SQUARE(a++);/*結果:a=7,即執(zhí)行了兩次增1。*/

正確的用法是:

b=SQUARE(a);

a++;/*結果:a-6,即只執(zhí)行了一次增lo*/

第十章內(nèi)存管理

【規(guī)范10.1】只引用屬于自己的存貯空間,防止引用已經(jīng)釋放的內(nèi)存空間。過程/函數(shù)中

分配的內(nèi)存,在過程/函數(shù)退出之前要釋放。

【規(guī)范10.2】不用malloc等動態(tài)分配內(nèi)存的函數(shù)。

【規(guī)范10.3】指針變量一定要初始化。

【規(guī)范10.4】分配內(nèi)存前,先判斷指針是否非空,如果為非空則應先釋放指針,然后將

指針置為NULLo

【規(guī)范10.5]避免數(shù)組或指針的下標越界,特別要當心發(fā)生“多r或者“少1”操作。

【規(guī)范10.6】任何時候使用指針時,均先判斷它是否為空,為空則應相應處理。

【示例】

內(nèi)存分配與釋放

BYTE*pbyData=NULL;

intiLength=100;

if(pbyData!=NULL)//

free(pbyData);

pbyData=NULL;

)

pbyData=(BYTE*)malloc(iLength);

if(pbyData==NULL)〃規(guī)范6.6.9

(

return:

}

memset(pbyData,0,iLength);

free(pbyData);

pbyData=NULL;

L10.1]使用Numega測試工具,檢查內(nèi)存泄漏。

在C++中,盡量避免在大循環(huán)內(nèi)部使用new、delete,這種操作會降低執(zhí)行

效率。

第十一章類的設計與繼承

【規(guī)范11.1]弄清楚所要編寫的是那種類。

【規(guī)范11.2】用小類代替巨類。

【規(guī)范11.31用組合代替繼承。

【規(guī)范11.4】避免從并非要設計成基類的類中繼承。

【規(guī)范11.5】優(yōu)先提供抽象接口。

【規(guī)范11.6】公用繼承即可替換性。繼承,不是為了重用,而是為了被重用。

【規(guī)范11.7】實施安全的改寫。

【規(guī)范11.8】考慮將虛擬函數(shù)聲明為非公用的,將公用函數(shù)聲明為非虛擬的。

【規(guī)范11.9】要避免提供隱式轉換。

【規(guī)范11.10】將數(shù)據(jù)成員設為私有的,無行為的聚集(C語言形式的struct)除外。

【規(guī)范11不要公開內(nèi)部數(shù)據(jù),不要過于自動自發(fā):避免返回類所管理的內(nèi)部數(shù)據(jù)的

句柄,這樣類的客戶就不會不受控制地修改對象自己擁有的狀態(tài)。

【規(guī)范11.12]明智地是使用Pimpl。

【規(guī)范11.13]優(yōu)先編寫非成員非友元函數(shù)。

【規(guī)范11.14]總是一起提供new和delete0

【規(guī)范11.15】如果提供類專門的new,應該提供所有標準形式(普通、就地和不拋出)。

第十二章構造、析構與復制

【規(guī)范12.1】以同樣的順序定義和初始化成員變量。

【規(guī)范12.2】在構造函數(shù)中用初始化代替賦值。

【規(guī)范12.3】避免在構造函數(shù)和析構函數(shù)中調用虛擬函數(shù)。

【期范12.4】將基類析構函數(shù)設為公用且虛擬的,或者保護且非虛擬的。

【規(guī)范12.5】析構函數(shù)、釋放和交換絕對不能失敗。

【規(guī)范12.6】一致地進行復制和銷毀。

【規(guī)范12.7】顯式地啟用或者禁止復制。

【規(guī)范12.8】避免切片,在基類中考慮用克隆代替復制。

【規(guī)范12.9】使用賦值的標準形式。

【規(guī)范12.10】只要可行,就提供不會失敗的swap(而且要正確地提供)。

第十三章重載與內(nèi)聯(lián)

【規(guī)范13.1】運算符既可以定義為全局函數(shù),也可以定義為成員函數(shù),一般應當按照以

下規(guī)則。

【示例】

運算符規(guī)則

所有的一元運算符建議重載為成員函數(shù)

=0[]->只能重載為成員函數(shù)

+=-=/=*=&=|="*=%=?=?=建議重載為成員函數(shù)

所有其它運算符建議重載為全局函數(shù)

【規(guī)范13.2】不要改變C++內(nèi)部數(shù)據(jù)類型(如int,float等)的運算符。

【規(guī)范13.3】不能重載,因為在類中對任何成員都有意義,己經(jīng)成為標準用

法。

【規(guī)范13.4】不能重載目前C++運算符集合中沒有的符號,如#,@,$等。原因有兩點,一

是難以理解,二是難以確定優(yōu)先級。

【規(guī)范13.5】對已經(jīng)存在的運算符進行重載時,不能改變優(yōu)先級規(guī)則,否則將引起混亂。

【規(guī)范13.6】如果程序同時重載了+=和+,則應該使a+=1)和2=a+b完成同樣的工

作。其他類似的操作符重載也一樣。

【規(guī)范13.7】用內(nèi)聯(lián)取代宏代碼。

【規(guī)范13.8】關鍵字inline必須與函數(shù)定義體放在一起才能使函數(shù)成為內(nèi)聯(lián),僅將inline

放在函數(shù)聲明前面不起任何作用。

【示例】

inlinevoidFoo(intx,inty);//inline僅與函數(shù)聲明放在一起

voidFoo(intx,inty)

而如下風格的函數(shù)Foo則成為內(nèi)聯(lián)函數(shù):

voidFoo(intx,inty);

iniinevoidFoo(intx,inty)//inline與函數(shù)定義體放在一起

(

)

【規(guī)范13.9】慎用內(nèi)聯(lián),在以二情況下不宜使用內(nèi)聯(lián)。

a)如果函數(shù)體內(nèi)的代碼比較長,使用內(nèi)聯(lián)將導致內(nèi)存消耗代價較高,不宜

使用內(nèi)聯(lián)。

b)如果函數(shù)體內(nèi)出現(xiàn)循環(huán),那么執(zhí)行函數(shù)體內(nèi)代碼的時間要比函數(shù)調用的

開銷大,也不宜使用內(nèi)聯(lián)。

第十四章類型安全

【規(guī)范14.1】避免使用類型分支,多使用多態(tài)。

【規(guī)范14.21依賴類型,而非其表示方式。

【規(guī)范14.3】避免使用reinterpret_cast。

【示例】

如果需要在不相關的類型之間強制轉換,應該通過void*進行轉換,不要直接用

reinterpret_cast.

不要這樣編寫:

Tl*pl=…;

T2*p2=rein

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論