版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C+褊碼規(guī)范及要求王卓2008-02-21版本Q次編寫有關(guān)C C+制編碼風(fēng)格和程序質(zhì)量可以參照圖質(zhì)量C/C+編程1 概述 錯(cuò)誤!未定義書簽。2 字體及顏色 錯(cuò)誤!未定義書簽。3 文件結(jié)構(gòu) 錯(cuò)誤!未定義書簽。文件頭注釋 錯(cuò)誤!未定義書簽。頭文件 錯(cuò)誤!未定義書簽。實(shí)現(xiàn)文件 錯(cuò)誤!未定義書簽。文件的組織結(jié)構(gòu) 錯(cuò)誤!未定義書簽。4 命名規(guī)則 錯(cuò)誤!未定義書簽。類/結(jié)構(gòu) 錯(cuò)誤!未定義書簽。函數(shù) 錯(cuò)誤!未定義書簽。變量 錯(cuò)誤!未定義書簽。常量 錯(cuò)誤!未定義書簽。枚舉、聯(lián)合、typedef 錯(cuò)誤!未定義書簽。宏、枚舉值 錯(cuò)誤!未定義書簽。名空間 錯(cuò)誤!未定義書簽。5 代碼風(fēng)格與版式 錯(cuò)誤!未定義書簽。類/
2、結(jié)構(gòu) 錯(cuò)誤!未定義書簽。函數(shù) 錯(cuò)誤!未定義書簽。變量、常量 錯(cuò)誤!未定義書簽。枚舉、聯(lián)合、typedef 錯(cuò)誤!未定義書簽。宏 錯(cuò)誤!未定義書簽。名空間 錯(cuò)誤!未定義書簽。異常 錯(cuò)誤!未定義書簽。1概述高品質(zhì)、易維護(hù)的軟件開發(fā)離不開清晰嚴(yán)格的編碼規(guī)范。 本文檔詳細(xì)描述C+鍬件開發(fā)過程中的編碼規(guī)范。本規(guī)范也適用于所有在文檔中出現(xiàn)的源碼。2字體及顏色強(qiáng)烈推薦采用 Visual Assist X作為Visual Studio的輔助工具。在編輯源碼時(shí),應(yīng)該 根據(jù)編輯器支持的自定義選項(xiàng)最大限度地滿足下表定義的高亮規(guī)范。顏色舉例注釋R0; G128; B0 (深綠).類、結(jié)構(gòu)、聯(lián)合、 枚舉R0; G0;
3、B255 (藍(lán))class CMyClass, enum ERRTYPE typedef int CODE .名空間R0; G0; B255 (藍(lán))namespace BaiY數(shù)字R255; GQ B0 (紅)012 119u 0xff .字符、字符串R0; G128; B128 (深藍(lán)綠)"string", 'c .宏定義、枚舉值11 R255; G128 B0 (橙黃)#define UNICODE enum RED GREEN BLUE ;操作符R136; GQ B0 (棕色)< >,=+ -* / ; ().方法/函數(shù)R136; GQ B0 (棕
4、色)MyFunc()變量1R128; G128 B128 (中灰色)int nMyVar;背景1R255; G255 B255 (白色)其它R0; G0; B0 (黑色)other things(通常金個(gè)錯(cuò)誤)Windows平臺(tái)中,應(yīng)該優(yōu)先使用字體:Fixedsys ,這也是操作系統(tǒng) UI (所有的菜單、按鈕、標(biāo)題欄、對話框等等)默認(rèn)使用的字體。該字體的好處很多:1、兼容性好:所有 Windows平臺(tái)都支持該字體2、顯示清晰:該字體為點(diǎn)陣字體,相對于矢量字體來說在顯示器中呈現(xiàn)的影像更為清晰。矢量字體雖然可以自由縮放,但這個(gè)功能對于純文本格式的程序源碼來說沒有任何實(shí)際作用。而且當(dāng)顯示字號較?。?
5、2pt以下)時(shí),矢量字體還有一些明顯的缺陷:文字的邊緣會(huì)有嚴(yán)重的凹凸感。一些筆畫的比例也會(huì)失調(diào)。開啟了柔化字體邊緣后,還會(huì)使文字顯得模糊不清。3、支持多語言:Fixedsys是UNICOD亨體,支持世界上幾乎所有的文字符號。這對編寫中 文注釋是很方便的。3文件結(jié)構(gòu)3.1文件頭注釋所有C+的源文件均必須包含一個(gè)規(guī)范的文件頭,文件頭包含了該文件的名稱、功能概 述、作者、版權(quán)和版本歷史信息等內(nèi)容。標(biāo)準(zhǔn)文件頭的格式為:/*! file*PRE模塊名文件名 相關(guān)文件文件實(shí)現(xiàn)功能:作者版本文件所屬的模塊名稱文件名與此文件相關(guān)的其它文件描述該文件實(shí)現(xiàn)的主要功能作者部門和姓名當(dāng)前版本號備注修改記錄:日期版本Y
6、YYY/MM/DD 其它說明修改人修改內(nèi)容作者或修改者名 修改內(nèi)容</PRE> */如果該文件有其它需要說明的地方,還可以專門為此擴(kuò)展一節(jié):/*! file*PRE模塊名 文件名相關(guān)文件文件實(shí)現(xiàn)功能:作者版本文件所屬的模塊名稱文件名與此文件相關(guān)的其它文件描述該文件實(shí)現(xiàn)的主要功能作者部門和姓名當(dāng)前版本號備注其它說明>修改記錄:版本修改人修改內(nèi)容作者或修改者名 > < 修改內(nèi)容日期YYYY/MM/DD</PRE>*項(xiàng)目1-項(xiàng)目-項(xiàng)目*項(xiàng)目2-項(xiàng)目-項(xiàng)目*/每行注釋的長度都不應(yīng)該超過80個(gè)半角字符。還要注意縮進(jìn)和對其,以利閱讀。關(guān)于文件頭的完整例子,如下:/
7、*! file*<PRE>模塊名:白楊string擴(kuò)展庫文件名:相關(guān)文件:文件實(shí)現(xiàn)功能:C+ string類功能擴(kuò)展作者:白楊版本:-備注:在 string的基礎(chǔ)上構(gòu)建,未添加任何數(shù)據(jù)成員-修改記錄:日期版本修改人修改內(nèi)容2003/08/27白楊創(chuàng)建2003/12/29白楊新增正則表達(dá)式、operator<<操作符等功能2004/01/28白楊新增部分函數(shù)2004/02/02白楊新增部分函數(shù)2004/03/11白楊新增部分函數(shù)2004/03/29白楊新增 ref(), set_size()等函數(shù)2004/06/28白楊移植至U namespace BaiY2004/07
8、/15白楊新增換碼/還原函數(shù);為所有正則函數(shù)增加perl風(fēng)格的字符類2004/07/19白楊新增vformat()函數(shù);重寫、改進(jìn)format()函數(shù)</PRE>*版權(quán)所有(c) 2003, 2004, 白楊,保留所有權(quán)利to_str、from_str、to_wstr、from_wstr 等函數(shù)只能做標(biāo)準(zhǔn) AASCIF字符集的寬/窄字符轉(zhuǎn) 換* format和vformat函數(shù)所能處理的最大字符串長度限制為MAX_STRING如需臨時(shí)改變,可以使用:format(maxLength, fmt, .) 函數(shù)和 vformat(maxLength, fmt, arglist) 函數(shù)-
9、支持如下ostream風(fēng)格的流式輸入操作,可以方便地用于將個(gè)類數(shù)據(jù)追加到串: operator<<(char)operator<<(BYTE)operator<<(int)operator<<(unsigned)opeartor<<(long)operator<<(unsigned long)operator<<(float)operator<<(double)operator<<(const stringEx&)operator<<(const char*)oper
10、ator<<(const BYTE*)operator<<(wchar_t)operator<<(wstringEx)- 支持兼容IEEE ( "POSIX.2")標(biāo)準(zhǔn),并且能夠正確處理包含0值之字符串的正則表達(dá)式功能。同時(shí)也支持perl風(fēng)格的字符類。為此提供了以下函數(shù):regex_find();regex_find_replace();regex_find_replace_all();regex_comp();regex_find_with_comp(); regex_free();- 也可以通過定義宏“ #define BaiY_US
11、E_REGEX 0”禁用此功能。- 為了提高搜索效率,避免大量重復(fù)的表達(dá)式編譯:regex_find()會(huì)自動(dòng)緩存最近一次使 用的正則表達(dá)式(緩存的內(nèi)容可以通過用空表達(dá)式調(diào)用regex_find()函數(shù)釋放)。如果需要高效率的交替搜索多個(gè)表達(dá)式,請使用regex_comp()、regex_find_with_comp() 、 regex free()函數(shù)。- 對于wstringEx ,還保證能夠正確識別UNICOD中符類(如空白符,大小寫等)在構(gòu)建一個(gè)正則表達(dá)式的時(shí)候,應(yīng)該盡量使用如:blank: 、:upper:這樣的字符類,是如A-Z這樣的自定義集合。所以而不- 以下是所有POSIX字符類
12、描述,及其對應(yīng)perl字符類POSIX 類perl類描述:alnum:字母和數(shù)字:alpha: a字母:lower: l小寫字母:upper: u大寫字母:blank:空白字符(空格和制表符):space:s所后生格符(比:blank:包含的范圍1 ):cntrl:不可打印的控制字符(退格、刪除、警鈴 .):digit: d十進(jìn)制數(shù)字:xdigit: x十六進(jìn)制數(shù)字:graph:可打印的非空白字符:print: p可打印字符:punct:標(biāo)點(diǎn)符號-此外,perl還有以下特殊字符類:perl 類等效POSIX表達(dá)式 描述o 0-7八進(jìn)制數(shù)字O A0-7非八進(jìn)制數(shù)字w :alnum:_單詞構(gòu)成字符
13、Wa:alnum:_非單詞構(gòu)成字符A a:alpha:非字母L A:lower:非小寫字母U A:upper:非大寫字母S A:space:非空格符D A:digit:非數(shù)字X A:xdigit:非十六進(jìn)制數(shù)字P A:print:非可打印字符-POSIX字符類必須在方括號中工作,相反,perl字符類則必須在方括號外工作。- 在允許perl風(fēng)格的正則搜索和替換中,還可以使用以下特殊字符換碼序列:r -回車n -換行b -退格t -制表符v -垂直制表符"-雙引號,-單引號2個(gè)函數(shù):*支持以給定的換碼符和換碼表進(jìn)行換碼和還原操作,為此提供了stringEx& escape_tra
14、nslate(IN const char cEscape,IN const stringEx vstTransTable2);stringEx& escape_restore(IN const char cEscape, IN const stringEx vstTransTable2, IN bool bEraseUnknownEscapeSequence = true, IN bool bUntouchEscEsc = false);-使用范例:2004/07/22. ?#include "./" ?.? extern void MyFunction ( voi
15、d );? ;?#include ""2004/07/22.3.2 類/結(jié)構(gòu)除了異常類等個(gè)別情況 (不希望用戶把該類看作一個(gè)普通的、正常的類之情況)外,C+類/結(jié)構(gòu)的命名應(yīng)該遵循以下準(zhǔn)則:C+鎂/結(jié)構(gòu)的命名類的名稱都要以大寫字母" C'開頭,后跟一個(gè)或多個(gè)單詞。為便于界定,每個(gè)單詞的首字母要大寫。推薦的組成形式類的命名推薦用"名詞t或"形容詞+名詞丁的形式,例如:"CAnalyzer", "CFastVector" .不同于C+琰的概念,傳統(tǒng)的 C結(jié)構(gòu)體只是一種將一組數(shù)據(jù)捆綁在一起的方式。傳統(tǒng) C
16、 結(jié)構(gòu)體的命名規(guī)則為:傳統(tǒng)C結(jié)構(gòu)體的命名 傳統(tǒng)C結(jié)構(gòu)體的名稱全部由大寫字母組成,單詞間使用下劃線界 定,例如:"SERVICE_STATUS", "DRIVER_INFO" .3.3 函數(shù)函數(shù)的命名函數(shù)的名稱由一個(gè)或多個(gè)單詞組成。為便于界定,每個(gè)單詞的首 字母要大寫。推薦的組成形式函數(shù)名應(yīng)當(dāng)使用"動(dòng)詞"或者"動(dòng)詞+名詞"(動(dòng)賓詞組)的形式。例如:"GetName()", "SetValue()", "Erase()","Reserve。"
17、; .保護(hù)成員函數(shù)保護(hù)成員函數(shù)的開頭應(yīng)當(dāng)加上一個(gè)下劃線"”以示區(qū)別,例如:"_SetState()” .私后成員國數(shù)類似地,私有成員函數(shù)的開頭應(yīng)當(dāng)加上兩個(gè)下劃線“”, 例如:"_DestroyImp()" .虛函數(shù)虛函數(shù)習(xí)慣以“ Do”開頭,如: "DoRefresh()", "_DoEncryption()"回調(diào)和事件處理函數(shù)回調(diào)和事件處理函數(shù)習(xí)慣以單詞“on開頭。例如: "_OnTimer()", "OnExit()” .3.4 變量變量應(yīng)該是程序中使用最多的標(biāo)識符了,變量的命名規(guī)
18、范可能是一套C+瑜名準(zhǔn)則中最重要的部分:變量的命名作用域前綴變量名由作用域前綴+類型前綴+一個(gè)或多個(gè)單詞組成。為便于界定,每個(gè)單詞的首字母要大寫。對于某些用途簡單明了的局部變量,也可以使用簡化的方式,如:i,j,k, x, y, z .作用域前綴標(biāo)明一個(gè)變量的可見范圍。作用域可以有如下幾種:前綴說明無局部變量m_類的成員變量(member)sm_類的靜態(tài)成員變量(static member )s_靜態(tài)艾量(static )g_外部全局變量(global )sg_靜態(tài)全局變量(static global )gg_進(jìn)程間共享的共享數(shù)據(jù)段全局變量(global global )除非不得已,否則應(yīng)該盡
19、可能少使用全局變量。類型前綴類型前綴標(biāo)明一個(gè)變量的類型,可以有如下幾種:前綴說明n整型和位域變量(number)e枚舉型變量(enumeration )c字符型變量(char)b布爾型變量(bool )f浮點(diǎn)型變量(float )p指針型變里和迭代子(pointer )pfn特別針對指向函數(shù)的指針變重和函數(shù)對象指針(pointerof function )g數(shù)組(grid )i類的實(shí)例(instance )對于經(jīng)常用到的類,也可以定義一些專門的前綴,如:std:string 和std:wstring類的前綴可以定義為 "st",std:vector 類的前綴可以定義為&qu
20、ot;v"等等。類型前綴可以組合使用,例如 "gc"表示字符數(shù)組,"ppn"表示指向整型的指針的指針等等。推薦的組成 變量的名字應(yīng)當(dāng)使用 "名詞"或者"形容詞+名詞 "。例如:"nCode", 形式"m_nState" , "nMaxWidth" .3.5 常量C+4引入了對常量的支持,常量的命名規(guī)則如下:常量的命名常量名由類型前綴+全大寫字母組成,單詞間通過下劃線來界定,如: cDELIMITER nMAX_BUFFER.類型前綴的定義與變量命
21、名規(guī)則中的相同。3.6 枚舉、聯(lián)合、typedef枚舉、聯(lián)合及typedef語句都是定義新類型的簡單手段,它們的命名規(guī)則為:枚舉、聯(lián)合、枚舉、聯(lián)合、typedef語句生成的類型名由全大寫字母組成,單詞間通過typedef的命名 下劃線來界定,如: FAR_PROCERROR_TYPE.3.7 宏、枚舉值宏、枚舉值的宏和枚舉值由全大寫字母組成,單詞間通過下劃線來界定,如:命名ERROR_UNKNOWOP_STOP.3.8 名空間C+珞空間是“類”概念的一種退化(相當(dāng)于只包含靜態(tài)成員且不能實(shí)例化的類)。它的引入為標(biāo)識符名稱提供了更好的層次結(jié)構(gòu),使標(biāo)識符看起來更加直觀簡捷,同時(shí)大大降低了名字沖突的可
22、能性。名空間的命名規(guī)則包括:名空間的命名名空間的名稱不應(yīng)該過長,通常都使用縮寫的形式來命名。例如,一個(gè)圖形庫可以將其所有外部接口存放在名空間"GLIB”中,但是將其換成"GRAPHIC_LIBRAR僦不大合適。如果碰到較長的名空間,為了簡化程序書寫,可以使用:namespace new_name = old_long_name ;語句為其定義一個(gè)較短的別名。4代碼風(fēng)格與版式代碼風(fēng)格的重要性怎么強(qiáng)調(diào)都不過分。一段稍長一點(diǎn)的無格式代碼基本上是不可讀的。先來看一下這方面的整體原則:空行的使用空行起著分隔程序段落的作用??招械皿w(不過多也不過少)將使程序的布局更加清晰??招胁粫?huì)浪費(fèi)
23、內(nèi)存,雖然打印含有空行的程序是 會(huì)多消耗一些紙張,但是值得。所以不要舍不得用空行。在每個(gè)類聲明之后、每個(gè)函數(shù)定義結(jié)束之后都要加2行空行。在一個(gè)函數(shù)體內(nèi),邏揖上密切相關(guān)的語句之間不加空行,其它地方應(yīng)加空行分隔。語句與代碼行一行代碼只做一件事情,如只定義一個(gè)變量,或只寫一條語句。這樣的代碼容易閱讀,并且方便于寫注釋。"if" 、"for" 、"while" 、"do"、"try" 、"catch" 等語句自占 一行,執(zhí)行語句不得緊跟其后。不論執(zhí)行語句有多少都要加" &q
24、uot;這樣可以防止書寫失誤??s進(jìn)和對齊程序的分界符"" 和T 應(yīng)獨(dú)占一行并且位于同一列,同時(shí)與引用它們的語句左對齊。" "之內(nèi)的代碼塊在""右邊一個(gè)制表符(4個(gè)半空格符) 處左對齊。如果出現(xiàn)嵌套的 " ",則使用縮進(jìn)對齊。如果一條語句會(huì)對其后的多條語句產(chǎn)生影響的話,應(yīng)該只對 該語句做半縮進(jìn)(2個(gè)半角空格符),以突出該語句。例如: void Function( int x) ? CSessionLock iLock (* m_psemLock;for (初始化;終止條件;更新) ? ? I .try? ? I .
25、catch ( const exception & err) ? I . catch (.) ? I .最大長度代碼行最大長度宜控制在70至80個(gè)字符以內(nèi)。代碼行不要過長,否則眼睛看不過來,也不便于打印。長行拆分長表達(dá)式要在低優(yōu)先級操作符處拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊,語句可讀。例如:if ( very_longer_variable1>= very_longer_variable2 )&& (very_longer_variable3<= very_longer_variable4)&&
26、amp; (very_longer_variable5<= very_longer_variable6)(dosomething();)空格的使用關(guān)鍵字之后要留空格。 象"const" > "virtual" > "inline" 、"case" 等關(guān)鍵字之后至少要留一個(gè)空格,否則無法辨析關(guān)鍵字。象"if"、"for"、"while"、"catch"等關(guān)鍵字之后應(yīng)留一個(gè)空格再跟左括號"(",以突出關(guān)
27、鍵字。函數(shù)名之后不要留空格,緊跟左括號"(",以與關(guān)鍵字區(qū)別。"("向后緊跟。而")"、","、";"向前緊跟,緊跟處不留空格。","之后要留空格,如 Function(x, y, z)。如果""不是r一行的結(jié)束符號,其后要留空格,如 for (initialization;condition;update)。賦值操作符、比較操作符、算術(shù)操作符、邏輯操作符、位域操作符, 如"="、"+ = ""> =
28、 "、"< = "、" + "、"*"、"%"、"&&"、"|" 、"<<", "A" 等二元操作符的前后應(yīng)當(dāng)加空格。一元操作符如"!"、""、"+"、"-"、"&"(地址運(yùn)算符)等前后 不加空格。象""、"."、"->"
29、這類操作符前后不加空格。對于表達(dá)式比較長的for、do、while、switch 語句和if語句,為了緊湊起見可以適當(dāng)?shù)厝サ粢恍┛崭?,如for (i=0; i<10; i+)和if (a<=b) && (c<=d) 例如:void Func1( int x, int y, int z); ? Function(); b->Function(); ? ?)為增強(qiáng)代碼的可 以下預(yù)定義宏對程序的編譯沒有任何影響,只為了增加代碼的可讀 讀性而定義的宏 性:說明NOTE需要注意的代碼TODO尚未實(shí)現(xiàn)的接口、類、算法等FOR_DBG標(biāo)記為調(diào)試方便而臨時(shí)增加的代碼OK
30、僅用于調(diào)試的標(biāo)記例如:TODOclass CMyClass;TODOvoid Function( void );FOR_DB0out << ""4.1 類/結(jié)構(gòu)類是C+4最重要也是使用頻率最高的新特性之一。類的版式好壞將極大地影響代碼品質(zhì)。注與文件一樣,每個(gè)類應(yīng)當(dāng)有一個(gè)注釋頭用來說明該類的各個(gè)方面。釋 類聲明換行緊跟在注釋頭后面,"class"關(guān)鍵字由行首開始書寫,后跟類名稱。界定符頭""和""應(yīng)獨(dú)占一行,并與"class"關(guān)鍵字左對其。與 /*! class類 *聲 <PRE
31、>明類名稱? : CXXX功能?: <簡要說明該類所完成的功能>異常類?: <屬于該類的異常類(如果有的話)>備注?: <使用該類時(shí)需要注意的問題(如果有的話)>典型用法: < 如果該類的使用方法較復(fù)雜或特殊,給出典型的代碼例子>作者? : <xxx></PRE>*/class CXXX.;對于功能明顯的簡單類(接口小于 10個(gè)),也可以使用簡單的單行注釋頭:);基類直接跟在類名稱之后,不換行,訪問說明符( public, private, 或protected )不 可省略。如:class CXXX : publi
32、c CAAA, private CBBB ();以 行 為 為 中 心沒人喜歡上來就看到一大堆私有數(shù)據(jù),大多數(shù)用戶關(guān)心的是類的接口與其提供的服 務(wù),而不是其實(shí)現(xiàn)。訪 問 說 明 符類 成 員 的訪問說明符(public, private, 'class '關(guān)鍵字左對其?;騪rotected )應(yīng)該獨(dú)占一行,并與類聲明中的對于比較復(fù)雜(成員多于 20個(gè))的類,其成員必須分類聲明。每類成員的聲明由訪問說明符(public,private, 或 protected )注釋不滿全行(80個(gè)半角字符)的,由 留一個(gè)半角空格符。字符補(bǔ)齊,最后一個(gè)+全行注釋開始。字符與注釋間要如果一類聲明中
33、有很多組功能不同的成員, 要與"class"關(guān)鍵字對其。還應(yīng)該用分組注釋將其分組。分組注釋也所以應(yīng)當(dāng)將公有的定義和成員放在類聲明的最前面,保護(hù)的放在中間,而私有的擺在最 后。每個(gè)成員的聲明都應(yīng)該由"class”關(guān)鍵字開始向右縮進(jìn)一個(gè)制表符(4個(gè)半角空格符),成員之間左對其。例如:class CXXX ( public : private :private :);嵌 套 的 類 聲 明初 始 化 列 表在相應(yīng)的邏輯關(guān)系確實(shí)存在時(shí),類聲明可以嵌套。嵌套類可以使用簡單的單行注釋頭: class CXXX ( ););應(yīng)當(dāng)盡可能通過構(gòu)造函數(shù)的初始化列表來初始化成員和基類。
34、初始化列表至少獨(dú)占一行,并且與構(gòu)造函數(shù)的定義保持一個(gè)制表符(4個(gè)半角空格)的縮進(jìn)。例如:CXXX CXXXXIN int nA IN bool bB) :m_n"nA), m_bBbB)( ); 初始化列表的書寫順序應(yīng)當(dāng)與對象的構(gòu)造順序一致,即:先按照聲明順序?qū)懟惓跏蓟?,再按照聲明順序?qū)懗蓡T初始化。如果一個(gè)成員"a"需要使用另一個(gè)成員 "b”來初始化,則"b"必須在"a"之前聲 明,否則將會(huì)產(chǎn)生運(yùn)行時(shí)錯(cuò)誤(有些編譯器會(huì)給出警告)。例如:class CXXXX : public CAA , public CBB (
35、 CYY m_iA; CZZ m_iB;? .);內(nèi) 聯(lián) 函 數(shù) 的 實(shí) 現(xiàn) 體定義在類聲明之中的函數(shù)將自動(dòng)成為內(nèi)聯(lián)函數(shù)。但為了使類的聲明更為清晰明了,應(yīng)盡 量避免直接在聲明中直接定義成員函數(shù)的編程風(fēng)格。鼓勵(lì)使用"inline"關(guān)鍵字將內(nèi)聯(lián)函數(shù)放在類聲明的外部定義。關(guān)于類聲明的例子,如下:/*! class*<PRE>類名稱? : Csem功能???:封裝信號量相關(guān)操作異常類? : CSem:Exp備注?:- 典型用法:-作者?:白楊</PRE>*class Csem(public :返回值?: <函數(shù)返回值的意義(如果有的話) >拋出異
36、常: < 可能拋出的異常及其說明(如果有的話),格式為: > ?類型1 : 說明 ?類型2 : 說明 ?復(fù)雜度?: <描述函數(shù)的復(fù)雜度/開銷(可選)>備注???: <其它注意事項(xiàng)(如果有的話)>典型用法: < 如果該函數(shù)的使用方法較復(fù)雜或特殊,給出典型的代碼例子>作者? : <xxx>(如果程序員負(fù)責(zé)的最小單位是文件,此項(xiàng)可選)</PRE> */函數(shù)原型( ?.)對于返回值、參數(shù)意義都很明確簡單函數(shù)(代碼不超過20行),也可以使用單行函數(shù)頭:函數(shù)定義和其它代碼之間至少分開2行空行。以下預(yù)定義宏對程序的編譯沒有任何影響,只為
37、了增強(qiáng)對參數(shù)的理解:宏說明IN輸入?yún)?shù)OUT輸出參數(shù)OPTIONAL可選參數(shù)通常指可以為NULL的指針參數(shù),帶默認(rèn)值的參數(shù)不需要這樣標(biāo)明RESERVED這個(gè)參數(shù)當(dāng)前未被支持,留待以后擴(kuò)展參數(shù)描述宏OWNER獲得參數(shù)的所有權(quán),調(diào)用者不再負(fù)責(zé)銷毀參數(shù)指定的對象UNUSED標(biāo)明這個(gè)參數(shù)在此版本中已不再使用CHANGED 參數(shù)類型發(fā)出變化ADDED新增的參數(shù)NOTE需要注意的參數(shù)-參數(shù)意義發(fā)生變化其中:除了空參數(shù)"void" 以外,每個(gè)參數(shù)左側(cè)都必須有 "IN" 和/或"OUT"修飾 既輸入又輸出的參數(shù)應(yīng)記為:"IN OUT&quo
38、t;,而不是"OUT IN"IN/OUT的左側(cè)還可以根據(jù)需要加入一個(gè)或多個(gè)上表中列出的其它宏參數(shù)描述宏的使用思想是:只要一個(gè)宏可以用在指定參數(shù)上(即:對這個(gè)參數(shù)來說,用 這個(gè)描述宏修飾它是貼切的),那么就應(yīng)當(dāng)使用它。也就是說,應(yīng)該把能用的描述宏都用上,以期盡量具體地描述一個(gè)參數(shù)。參數(shù)列表的格式為:參數(shù)列表參數(shù)描述宏1參數(shù)類型1參數(shù)1,參數(shù)描述宏2參數(shù)類型2參數(shù)2,.例如:IN const int nCode, OUT string & nNameOWNERN CDatabase* pDB, OPTIONALIN OUT int * pRecordCount = NU
39、LLIN OUTstring & stRuleList , RESERVEDN int nOperate = 0其中:”參數(shù)描述宏"見上文參數(shù)命名規(guī)范與變量的命名規(guī)范相同"extern", "static", "inline"等函數(shù)存儲(chǔ)類說明應(yīng)該在聲明和定義中一致并且顯式地使用。不允許隱式地使用一個(gè)類型聲明,也不允許一個(gè)類型聲明僅存在于函數(shù)的聲明或 定義中。由于C+詡言的限制,成員函數(shù)的 "static", "virtual", "explicit"等存儲(chǔ)類
40、說明不允許出現(xiàn)在函數(shù)定義中。但是為了明確起見,這些存儲(chǔ)類應(yīng)以注釋的形式在定義中給出。例如:成 員 函 數(shù) 的 存 儲(chǔ) 類"virtual*/CThread: EXITCODECSrvCtl 二 CWrkTrd: Entry (void ) ?."static*/inline voidstringEx : regex_free (IN OUTvoid *& pRegER ?.特別地,為縮短聲明的長度,"inline"關(guān)鍵字可以在成員函數(shù)聲明中省略。類似地,參數(shù)的默認(rèn)值只能出現(xiàn)在函數(shù)聲明中,但是為了明確起見,這些默認(rèn)值應(yīng)以注 釋的形式在定義中給出。例
41、如:boolstringEx : regex find (OUT VREGEXRESULT/Result ,stringEx stRegEx,size_t nIndex ? /*= 0*/ ,size_t nStartPos ?/*= 0*/ ,boolbNoCase?/*= false*/boolbNewLine?/*= true*/boolbExtended ?/*= true*/boolbNotBOL? ? /*= false*/boolbNotEOL? ? /*= false*/boolbUsePerlStyle/*= false*/)const? ? IN ? ? IN ? ? IN
42、 ? IN ?IN ?IN ?IN ?IN ? IN ?)異 常 過 濾 器對于任何肯能拋出異常的函數(shù),必須在其聲明和定義中顯式地指定異常過濾器,并在過 濾器中列舉該函數(shù)可能拋出的異常。例如:intFunction (IN const char* pcNam。throw (byExp, exception );代 碼 段 注 釋如果函數(shù)體中的代碼較長,應(yīng)該根據(jù)功能不同將其分段。代碼段間以空行分離,并且每 段代碼都以代碼段分割注釋作為開始。例如:voidCXXXFunction( IN void * pmodAddr) ? if ( NULL= pmodAddr) ? return ;? CSe
43、ssionLock iLock (* sm_hSELock);?讓 相 同 的 代 碼 只 出 現(xiàn)一次為了使程序更容易調(diào)試、修改,盡量降低日后維護(hù)的復(fù)雜性,應(yīng)該把需要在一個(gè)以上位 置使用的代碼段封裝成函數(shù)。哪怕這段代碼很短,為了以后維護(hù)方便著想,也應(yīng)當(dāng)將其 封裝為內(nèi)聯(lián)函數(shù)。關(guān)于函數(shù)的例子,如下:/*! function*<PRE>函數(shù)名? : GetAllSubDirs功能?:獲得所有符合條件的子目錄列表參數(shù)? : OUT vResult?: ? IN? dirPattern?: ? IN? includeSubdir : ? IN? includeHidden : ? IN? i
44、ncludeDot?: 返回值?:符合條件的子目錄數(shù)量 拋出異常:-用來儲(chǔ)存結(jié)果要查找的子目錄通配符是否包含子目錄是否包含隱含目錄是否包含“.”和“.”系統(tǒng)目錄備注???:無論是否成功,vResult中的原內(nèi)容都將被清空 典型用法:-作者?:白楊</PRE>* /ULONGCDir: GetAllSubDirs (OUTVSTR vResult , ? IN tstringEx dirPattern /*= byT("*")*/*= false*/,/*= true*/ , /*= false*/) const?IN?IN?INbool includeSubdi
45、r ?bool includeHidden ?bool includeDot ? ?4.24.34.44.5.while風(fēng)格等,以下是一個(gè) goto風(fēng)格的例子? if (! Operationl (nCode)? goto onerr ;?try? ? Operation2 (i);? ? catch (.)? r = true ;? goto onerr ;? r = true ;onerr :?.清理代碼 ?return r;由上例可見,goto風(fēng)格的錯(cuò)誤處理至少存在問題如下:錯(cuò)誤處理代碼和其它代碼混雜在一起,使程序不夠清晰易讀變量必須在"goto"之前聲明,違反就近原
46、則多處跳轉(zhuǎn)的使用破壞程序的結(jié)構(gòu)化,影響程序的可讀性,使程序容 易出錯(cuò)對每個(gè)會(huì)拋出異常的操彳都需要用額外的try.catch 塊檢測和處理稍微復(fù)雜一點(diǎn)的分類錯(cuò)誤處理要使用多個(gè)標(biāo)號和不同的goto跳轉(zhuǎn)(如:"onOp1Err", "onOp2Err" .)。這將使程序變得無法理解和錯(cuò)誤百出。再來看看do.while 風(fēng)格的錯(cuò)誤處理:.while進(jìn)行錯(cuò)誤處理的例子boolFunction (void )(? int nCode, i ;? bool r = false ;?.? do? ? ? if (! Operationl (nCode)? ? ? break ;? ? ? do? ? ? try? ? ? Operation2 (i );? ? ? catch (.)? ? ? r = true ;? ? break ;? ? ? while (Operation3()? ? r = true ;? while ( false );?.清理代碼?return r;與goto風(fēng)格的錯(cuò)誤處理相似:錯(cuò)誤處理代碼和其它代碼嚴(yán)重混雜,使程序非常難以理解無法進(jìn)行分類錯(cuò)誤處理對每個(gè)會(huì)拋出異常的操彳都需要用額外的try.catch塊檢測和處理此外,還有一種更為糟糕的錯(cuò)誤處理風(fēng)格一一直接在出錯(cuò)的位置完成錯(cuò)誤處 理:? if (
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024離婚法律文件:標(biāo)準(zhǔn)合同范例版B版
- 2024育兒嫂住家服務(wù)合同特殊技能培訓(xùn)范本3篇
- 2024研學(xué)合同協(xié)議
- 2025年度新型環(huán)保材料鋪設(shè)打地坪合同范本3篇
- 2024聘用退休人員勞務(wù)合同范本
- 2025年度專業(yè)打印機(jī)租賃合同包含打印耗材及維護(hù)4篇
- 2025年度智能家居系統(tǒng)安裝與維護(hù)承包合同8篇
- 2025年度生物科技出借咨詢與服務(wù)協(xié)議4篇
- 2024年高端裝備制造與技術(shù)轉(zhuǎn)讓協(xié)議
- 2024版洗車服務(wù)單位協(xié)議2篇
- 餐飲行業(yè)智慧餐廳管理系統(tǒng)方案
- 2025年度生物醫(yī)藥技術(shù)研發(fā)與許可協(xié)議3篇
- 電廠檢修安全培訓(xùn)課件
- 殯葬改革課件
- 2024企業(yè)答謝晚宴會(huì)務(wù)合同3篇
- 雙方個(gè)人協(xié)議書模板
- 車站安全管理研究報(bào)告
- 瑪米亞RB67中文說明書
- 植物和五行關(guān)系解說
- 滬教牛津版初中英語七年級下冊全套單元測試題
- 因式分解法提公因式法公式法
評論
0/150
提交評論