軟件編碼規(guī)范_第1頁(yè)
軟件編碼規(guī)范_第2頁(yè)
軟件編碼規(guī)范_第3頁(yè)
軟件編碼規(guī)范_第4頁(yè)
軟件編碼規(guī)范_第5頁(yè)
已閱讀5頁(yè),還剩89頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

軟件編碼規(guī)范 文件狀態(tài):[√]草稿[]正式發(fā)布[]正在修改文件編號(hào):RDC-DED-SCS-SPC-00當(dāng)前版本:作者:審核人:完成日期:中國(guó)人民銀行清算總中心支付系統(tǒng)開(kāi)發(fā)中心文檔修訂記錄版本編號(hào)變化狀態(tài)簡(jiǎn)要說(shuō)明日期變更人批準(zhǔn)日期批準(zhǔn)人注:變化狀態(tài):A—增加,M—修改,D—?jiǎng)h除

目錄第一篇 C/C++編碼規(guī)范 6第一章 代碼組織 6第二章 命名 92.1 文件命名 92.2 變量命名 92.3 常量與宏命名 102.4 類命名 102.5 函數(shù)命名 102.6 參數(shù)命名 11第三章 注釋 123.1 文檔化注釋 123.2 語(yǔ)句塊注釋 173.3 代碼維護(hù)注釋 20第四章 編碼風(fēng)格 224.1 排版風(fēng)格 224.2 頭文件 264.3 宏定義 274.4 變量與常量 304.5 條件判斷 324.6 空間申請(qǐng)與釋放 334.7 函數(shù)編寫(xiě) 334.8 類的編寫(xiě) 374.9 異常處理 404.10 特殊限制 40第五章 編譯 41第六章 ESQL/C編碼 46第二篇 Java編碼規(guī)范 47第一章 代碼組織 48第二章 命名 512.1 包命名 512.2 類命名 512.3 接口命名 512.4 方法命名 512.5 變量命名 512.6 類變量命名 522.7 常量命名 522.8 參數(shù)命名 52第三章 注釋 533.1 文檔化注釋 533.2 語(yǔ)句塊注釋 573.3 代碼維護(hù)注釋 59第四章 編碼風(fēng)格 614.1 排版風(fēng)格 614.2 包與類引用 664.3 變量與常量 664.4 類編寫(xiě) 674.5 方法編寫(xiě) 684.6 異常處理 714.7 特殊限制 71第五章 編譯 73第六章 JSP編碼 746.1 文件命名及存放位置 746.2 內(nèi)容組織 746.3 編碼風(fēng)格 766.4 注釋 786.5 縮進(jìn)與對(duì)齊 786.6 表達(dá)式 796.7 JavaScript 79第三篇 PowerBuilder編碼規(guī)范 80第一章 代碼組織 81第二章 命名 822.1 文件命名 822.2 對(duì)象命名 822.3 變量命名 842.4 常量命名 852.5 函數(shù)與事件命名 852.6 參數(shù)命名 85第三章 注釋 853.1 文檔化注釋 853.2 語(yǔ)句塊注釋 883.3 代碼維護(hù)注釋 88第四章 編碼風(fēng)格 894.1 界面風(fēng)格 894.2 排版風(fēng)格 934.3 變量與常量 954.4 條件判斷 964.5 空間申請(qǐng)與釋放 974.6 函數(shù)編寫(xiě) 974.7 特殊限制 97第五章 SQL編碼 98前言程序編碼是一種藝術(shù),既靈活又嚴(yán)謹(jǐn),充滿了創(chuàng)造性與奇思妙想。然而應(yīng)用軟件設(shè)計(jì)是一項(xiàng)團(tuán)結(jié)協(xié)作工程,而非程序員展示個(gè)人藝術(shù)的舞臺(tái),大型應(yīng)用軟件項(xiàng)目更是由很多程序員組成的大型開(kāi)發(fā)團(tuán)隊(duì)協(xié)同完成的。每個(gè)程序員都有自己的編碼經(jīng)驗(yàn)與風(fēng)格,如果缺乏統(tǒng)一的編程規(guī)范,則可能導(dǎo)致軟件產(chǎn)品最終程序代碼風(fēng)格迥異,可讀性與可維護(hù)性均較差,不僅給程序代碼的理解帶來(lái)障礙,也增加維護(hù)階段的工作量。此外,經(jīng)驗(yàn)證明不規(guī)范的編碼行為往往還會(huì)導(dǎo)致程序出現(xiàn)更多的隱含錯(cuò)誤。為規(guī)范編碼行為,增強(qiáng)程序代碼的可讀性、可維護(hù)性,提高編碼質(zhì)量與效率,保障應(yīng)用軟件產(chǎn)品整體品質(zhì)與可持續(xù)開(kāi)發(fā)性,特制定本規(guī)范。本規(guī)范分C/C++編碼規(guī)范、Java編碼規(guī)范、PB編碼規(guī)范三篇,分別從代碼組織、命名、注釋、編碼風(fēng)格、編譯等方面加以闡述。規(guī)范文本分為規(guī)則與建議兩種,其中規(guī)則是強(qiáng)制執(zhí)行的條款,建議則由程序員根據(jù)實(shí)際情況靈活掌握。C/C++編碼規(guī)范代碼組織使用不同的文件分別放置模塊的約束與實(shí)現(xiàn)。C++程序的約束文件使用.hpp做擴(kuò)展名,實(shí)現(xiàn)文件使用.cpp做擴(kuò)展名;C程序的約束文件使用.h做擴(kuò)展名,實(shí)現(xiàn)文件使用.c做擴(kuò)展名。一個(gè)模塊可以包含一個(gè)類或功能上緊密聯(lián)系的多個(gè)類。禁止將功能關(guān)聯(lián)松散的多個(gè)類,放置到一個(gè)模塊中。模塊約束應(yīng)僅包含模塊對(duì)外提供的功能,禁止將模塊內(nèi)部使用的功能聲明在模塊約束中。下例中IsChineseChar()是內(nèi)部使用的函數(shù),不提供給外部應(yīng)用使用,因此不能在commpub.hpp中增加聲明。例:commpub.hppBOOLIsChineseString(constchar*sInStr);例:commpub.cppstaticBOOLIsChineseChar(constchar*s){……;}BOOLIsChineseString(constchar*sInStr){for(intii=0;ii<strlen(sInStr);ii++){if(!IsChineseChar(sInStr+ii)){returnFALSE;}}returnTRUE;}簡(jiǎn)單應(yīng)用應(yīng)創(chuàng)建下列目錄結(jié)構(gòu),模塊程序代碼應(yīng)分別放置到src/include目錄與src/source目錄,編譯文件放置到src/source目錄,編譯后的可執(zhí)行文件放置到rel/bin目錄,靜態(tài)庫(kù)或動(dòng)態(tài)庫(kù)放置到rel/lib目錄(應(yīng)用使用的外部庫(kù)及頭文件放置在rel同級(jí)的lib與lib/include目錄)。復(fù)雜應(yīng)用應(yīng)分子系統(tǒng)創(chuàng)建目錄結(jié)構(gòu),模塊程序代碼應(yīng)分別放置到src/module/include目錄與src/module/source目錄,應(yīng)用編譯文件放置到src目錄,編譯后的可執(zhí)行文件放置到rel/bin目錄,靜態(tài)庫(kù)或動(dòng)態(tài)庫(kù)放置到rel/lib目錄。(應(yīng)用使用的外部庫(kù)及頭文件放置在rel同級(jí)的lib與lib/include目錄)各子系統(tǒng)可以創(chuàng)建獨(dú)立的編譯文件并放置到src/module/source目錄,編譯后的可執(zhí)行文件放置到rel/bin/module目錄或rel/bin,靜態(tài)庫(kù)或動(dòng)態(tài)庫(kù)放置到rel/lib/module或rel/lib目錄。此時(shí),應(yīng)創(chuàng)建一個(gè)編譯全部子系統(tǒng)的編譯文件或腳本放置到src目錄。命名命名應(yīng)遵循下列原則:應(yīng)簡(jiǎn)單清晰通俗;應(yīng)使用英文命名,禁止使用中文命名;應(yīng)盡量選擇通用詞匯;應(yīng)使用完整單詞或詞組,避免使用簡(jiǎn)稱;應(yīng)準(zhǔn)確表達(dá)其含義;避免同時(shí)使用易混淆的字母與數(shù)字,如1與l,0與o;禁止使用只靠大小寫(xiě)區(qū)分的多個(gè)名稱;多單詞組成的名稱,單詞的首字母應(yīng)大寫(xiě),如FileName。名稱太長(zhǎng)超過(guò)15字符時(shí)應(yīng)使用簡(jiǎn)稱。簡(jiǎn)稱應(yīng)遵循:應(yīng)使用標(biāo)準(zhǔn)的或常用的簡(jiǎn)寫(xiě),如Temp(tmp),Length(len);應(yīng)用范圍內(nèi)簡(jiǎn)寫(xiě)應(yīng)一致且規(guī)范,避免各處簡(jiǎn)寫(xiě)各不相同;簡(jiǎn)寫(xiě)可以使用單詞的前一個(gè)或多個(gè)字母,如Channel(Chan)、Connect(Conn);也可以使用去掉所有的不在詞頭的元音字母,如screen(scrn),primtive(prmv);多個(gè)單詞組成的名稱,使用有意義的單詞或去掉無(wú)用的后綴并簡(jiǎn)稱,如CountofFailure(FailCnt),PagingRequest(PagReq)。文件命名文件命名應(yīng)使用模塊名的小寫(xiě)字母形式。禁止使用漢字或大、小寫(xiě)字母混用作為代碼文件名。變量命名變量命名主要采用匈牙利命名法,格式為[作用域范圍前綴_][前綴]基本類型+名稱。其中,作用域范圍前綴、前綴以小寫(xiě)字母表示且可選,基本類型以小寫(xiě)字母表示且必選。常用前綴符前綴符含義例子g_全局變量g_stSystem,g_cMacType,g_strSysNames_靜態(tài)變量s_nCurCnt,s_strStaticName,s_pSysTimem_類數(shù)據(jù)成員m_nBankType,m_sWrkBuffer,m_strMyNameh句柄類變量hnFileHandle,hnSocket,hpProcHandlep指針類變量psReadBuff,pstrRetStr,ppTargeta數(shù)組類變量anPorts,asSendBuffers,apWrkBuffs常用基本類型符前綴符含義例子bboolbOK,bQuit,bFindc、chcharcFlag,cBankType,chSubSystemTypeschar[]sSysName,sStaticName,sTimeStrstrCString、StringstrSysName,strStaticName,strTimeStrbyunsignchar[]byMacStr,bySendBuffer,bySrcBuffern、iintnCnt,nPort,nRetCodellonglFileSize,lOffset,lCountddoubledAmount,dSumVal,dWrkValffloatfAmount,fSumVal,fWrkValui/ulunsignedint/longuiCnt,uiFileSize,ulRetCountwWORD與unsignedint等價(jià)的32位整數(shù)dwDOUBLEWORD與unsignedlong等價(jià)的64位整數(shù)em枚舉型變量emDays,emColors,emSetst結(jié)構(gòu)型編碼stSystem,stCtrlData,stSet禁止使用單字母作為變量名。但下列常用單字母變量除外:常用單字母變量變量類型說(shuō)明i,j,k,m,nint循環(huán)變量cchar單字符變量schar[]字符數(shù)組變量x,yint位置變量pchar*指針變量常量與宏命名常量與宏應(yīng)使用全大寫(xiě)名稱,多詞組名稱使用_分隔各單詞,并使用斷行注釋說(shuō)明其含義如:constintMAX_BUFF_SIZE=1024///<最大存儲(chǔ)區(qū)字節(jié)數(shù)#defineMAX_FRAME_SIZE512///<單幀的最大長(zhǎng)度作為錯(cuò)誤碼或返回碼的宏,應(yīng)使用E_類型_NAME形式,并使用斷行注釋說(shuō)明其含義。#defineE_FILE_NOTFOUND61101001///<文件不存在!#defineE_DB_SELECT_FAIL62301050///<選取數(shù)據(jù)庫(kù)失敗!#defineE_SYS_INVALID_STATUS62301001///<系統(tǒng)狀態(tài)非法!作為編譯條件的宏,應(yīng)使用_<NAME>_形式。如:#ifdef_NONE_THROW_#endif…#ifndef_FOR_CCPC_#endif為防止重復(fù)包含而定義的頭文件預(yù)處理宏,應(yīng)使用__NAME_HPP__(C++)或__NAME_H__(C)形式,其中NAME為模塊名稱。如:#ifndef__CSIGNAL_HPP__#define__CSIGNAL_HPP__…#endif#ifndef__CSIGNAL_H__#define__CSIGNAL_H__…#endif類命名類命名應(yīng)使用字符C|T+名稱形式。其中名稱應(yīng)使用名詞或名詞短語(yǔ),且每個(gè)單詞首字母大寫(xiě)。如:CSignal,CFile,CString,CTagMgr。函數(shù)命名函數(shù)命名應(yīng)使用能夠表達(dá)函數(shù)功能的英文動(dòng)詞或動(dòng)賓結(jié)構(gòu)短語(yǔ),且每個(gè)單詞的首字母大寫(xiě)。如:GetName(),StrTrimLeft(),KillProc()。禁止在函數(shù)名稱中使用非字母或數(shù)字的其他字符,如下劃線_。不應(yīng)在函數(shù)名中使用數(shù)字,如:GetName1(),Kill2()。但數(shù)字是短語(yǔ)一部分的,可以使用,如KillSigusr2()。參數(shù)命名函數(shù)或方法的參數(shù)命名參考變量命名,但應(yīng)使用In,Out、Ret等簡(jiǎn)寫(xiě)修飾參數(shù),增加函數(shù)聲明的可讀性。如:BOOLIsSpaceStr(LPCSTRsInStr,ULONGnMaxLen=0,ULONG*plRetOffset=NULL);voidHexToBin(LPCSTRsInStr,BYTE*psOutStr,ULONG*plRetSize=NULL);注釋程序代碼中增加注釋的目標(biāo)是幫助對(duì)程序的閱讀理解,不宜太多或太少,太多則會(huì)對(duì)閱讀產(chǎn)生干擾,太少則不利于代碼理解,因此只在必要的地方才加注釋,且準(zhǔn)確、易懂、簡(jiǎn)潔。文檔化注釋文件注釋文件注釋放置在文件頭部,主要包括此文件的功能說(shuō)明,編寫(xiě)人和修改人以及編寫(xiě)和修改的日期,版權(quán)聲明,版本等信息,應(yīng)盡量使用中文。注釋格式如下:/***@filefilename.hpp*@brief文件簡(jiǎn)要說(shuō)明**文件詳細(xì)說(shuō)明**@author*-時(shí)間作者1貢獻(xiàn)1*-時(shí)間作者2貢獻(xiàn)2*-時(shí)間作者3貢獻(xiàn)3**@version*-時(shí)間版本1簡(jiǎn)要版本說(shuō)明1*-時(shí)間版本2簡(jiǎn)要版本說(shuō)明2**@par其他重要信息:*其他重要信息說(shuō)明**@warning警告信息**@par版權(quán)信息:*版本聲明信息*/例:/***@filecsignal.hpp*@briefUNIX信號(hào)函數(shù)封裝類**本類封裝部分UNIX信號(hào)處理函數(shù),簡(jiǎn)化在UNIX下編寫(xiě)信號(hào)處理程序的編碼難度。<br>*本類主要提供下列三類方法:*-信號(hào)集合管理,提供信號(hào)集合的添加、刪除、判斷功能;*-信號(hào)句柄管理,提供設(shè)置與獲取信號(hào)處理函數(shù)功能;*-信號(hào)處理,設(shè)置與獲取阻塞信號(hào)集、發(fā)送信號(hào)、等待信號(hào)功能。**@author*-2007-03-05lny創(chuàng)建初始版本*-2007-03-07lny添加文檔注釋信息*@version*-2007-03-05V1.0創(chuàng)建初始版本*-2007-03-07V2.0添加文檔注釋信息**@warning本類不能在WIN32操作系統(tǒng)使用。**@par版權(quán)信息:*Copyright(C)2007-2007CNCC/CDC*/注:粗體字為需定制化的內(nèi)容;蘭色字為可選的內(nèi)容,如果沒(méi)有這些內(nèi)容,請(qǐng)刪除。下同。類注釋類注釋放置在類聲明前,主要介紹類的功能及相關(guān)說(shuō)明。注釋格式如下:/***@brief類簡(jiǎn)要說(shuō)明**類詳細(xì)說(shuō)明**@par其他重要信息*其他重要信息說(shuō)明**@par變更歷史:*-時(shí)間作者修改說(shuō)明*/例:/***@briefUNIX信號(hào)處理函數(shù)封裝類**本類封裝部分UNIX信號(hào)處理函數(shù),簡(jiǎn)化在UNIX下編寫(xiě)信號(hào)處理程序的編碼難度。<br>*本類主要提供下列三類方法:*-信號(hào)集合管理,提供信號(hào)集合的添加、刪除、判斷功能;*-信號(hào)句柄管理,提供設(shè)置與獲取信號(hào)處理函數(shù)功能;*-信號(hào)處理,設(shè)置與獲取阻塞信號(hào)集、發(fā)送信號(hào)、等待信號(hào)功能。**@warning本類不能在WIN32操作系統(tǒng)使用。*/classCSignal{…}函數(shù)或方法注釋函數(shù)或方法注釋放置在其聲明前,主要介紹函數(shù)的功能、參數(shù)、返回值、異常、使用說(shuō)明、范例、引用關(guān)系、變更信息等信息。注釋格式如下:/***@brief函數(shù)功能簡(jiǎn)要說(shuō)明*@param[in|out]參數(shù)名稱1參數(shù)1簡(jiǎn)要說(shuō)明;*@param[in|out]參數(shù)名稱2參數(shù)2簡(jiǎn)要說(shuō)明。*@return返回值說(shuō)明*-返回值1返回值1說(shuō)明;*-返回值2返回值2說(shuō)明。*@exception異常說(shuō)明*-異常1異常1說(shuō)明;*-異常2異常2說(shuō)明。**@note函數(shù)功能詳細(xì)說(shuō)明。*-詳細(xì)說(shuō)明1;*-詳細(xì)說(shuō)明2。*@warning警告信息*@deprecated函數(shù)即將失效警告*@see引用說(shuō)明**@par使用范例:*@code*例子程序*@endcode**@par算法或流程說(shuō)明:*詳細(xì)算法或流程說(shuō)明**@par變更歷史:*-時(shí)間作者修改說(shuō)明*/例:/***@brief添加一個(gè)或多個(gè)信號(hào)到信號(hào)集合。*@param[out]stSet要操作的信號(hào)集合;*@param[in]nSignal要添加到集合的信號(hào);*@param[in]nOtherSignal要添加到集合的其他信號(hào)。*@return添加失敗返回負(fù)整數(shù),失敗原因可以從errno獲取。*@note如果要添加多個(gè)信號(hào),則必須使用0作為最后一個(gè)信號(hào)。*@warning如果添加多個(gè)信號(hào)時(shí)沒(méi)有使用0作結(jié)束,則程序可能異常中止!*@seeDelFromSet()、AddAllToSet()、ClearSet()**@par使用范例:*@code*intnRetCode=sig.AddToSet(&stSet,SIGUSR1,SIGUSR2,0);*if(nRetCode<0){...Fail...}*...*nRetCode=sig.AddToSet(&stSet,SIGHUP);*if(nRetCode<0){...Fail...}*@endcode*/intAddToSet(sigset_t*stSet,intnSignal,intnOtherSignal=0,...);重要的或復(fù)雜的函數(shù),應(yīng)提供算法說(shuō)明或使用范例。如:例:/***@brief根據(jù)行號(hào)與密碼生成報(bào)尾校驗(yàn)碼作為身份認(rèn)證串。*@param[in]sBankCode行號(hào);*@param[in]sPassword密碼。*@return身份認(rèn)證串。*@par算法介紹:*-#計(jì)算sBankCode+sPassword的MD5數(shù)字摘要,輸出32位字符;*-#取32位字符的0,5,10,15,16,21,26,31位作16位字符串的偶數(shù)位;*-#取"AUTHBEPS"各位作16位字符串的奇數(shù)位;*-#加密這16位的字符串,得到32位的字符串作為認(rèn)證串。*/CStringBuildAuthStr(LPCSTRsBankCode,LPCSTRsPassword);數(shù)據(jù)成員注釋類的每個(gè)數(shù)據(jù)成員均使用斷行注釋。注釋格式如下:例:classCMTMsg{…private:BOOLm_bBodyInFile; ///<是文件型報(bào)文?CStringm_strFileName; ///<文件型報(bào)文的文件名CStringm_strBody; ///<直接設(shè)置的報(bào)體串CMTMsgHeaderm_Header; ///<報(bào)頭對(duì)象CMTMsgTailm_Tail; ///<報(bào)尾對(duì)象CMTBatHeaderm_BatHeader; ///<批量業(yè)務(wù)頭對(duì)象}結(jié)構(gòu)注釋結(jié)構(gòu)可使用簡(jiǎn)單注釋,也可使用與類相同的注釋格式,其數(shù)據(jù)成員使用斷行注釋。注釋格式如下:例:/**報(bào)頭結(jié)構(gòu),總長(zhǎng)度138字節(jié)。*/structCMTHeaderMap{charblockMark[3]; ///<報(bào)頭塊前綴={1:。charverID[1]; ///<版本號(hào),保留=0。charmesgLen[6]; ///<報(bào)文總長(zhǎng)度,保留,目前為空白。charappTradeCode[8]; ///<業(yè)務(wù)碼0位(系統(tǒng)號(hào))1-3位CMT號(hào)4位節(jié)點(diǎn)5-7位保留。charstartAddr[12]; ///<報(bào)文源地址,即報(bào)文發(fā)起人。chardestAddr[12]; ///<報(bào)文目標(biāo)地址,即報(bào)文接收人。charmesgPurp[1]; ///<報(bào)文用途,保留。charoutForm[1]; ///<輸出標(biāo)識(shí),保留。charmesgID[MSGID_LEN]; ///<報(bào)文標(biāo)識(shí)號(hào),報(bào)文發(fā)起人生成,通信層唯一確定一個(gè)報(bào)文。charmesgReqNo[REQUESTID_LEN];///<報(bào)文參考號(hào),報(bào)文發(fā)起人生成,回應(yīng)報(bào)文帶回進(jìn)行報(bào)文匹配。charworkDate[8]; ///<報(bào)文日期,格式為YYYYMMDD。charsentTime[14]; ///<報(bào)文時(shí)間,格式為YYYYMMDDHHMISS。charexpTime[4]; ///<報(bào)文有效期,保留,0-0xFFFF=65535。chardeliTime[6]; ///<報(bào)文提交時(shí)間,保留,格式為HHMISS。charmesgPRI[1]; ///<報(bào)文優(yōu)先級(jí),0x0-0xF=15。charreserve[20]; ///<保留域。charfinalMark[1]; ///<報(bào)頭塊后綴=}。};宏與變量注釋宏與變量使用簡(jiǎn)單注釋或斷行注釋。特別重要的宏可以使用與類相同的文檔注釋。注釋格式如下:例:#defineMBT_PREFIX"{"http:///<報(bào)文塊開(kāi)始標(biāo)志#defineMBT_SUFFIX"}"http:///<報(bào)文塊結(jié)束標(biāo)志#defineMBT_HEADER"{1:"http:///<報(bào)頭塊開(kāi)始標(biāo)志#defineMBT_BUSINESSHEADER"{2:"http:///<業(yè)務(wù)頭塊開(kāi)始標(biāo)志#defineMBT_BUSINESSDATA"{3:"http:///<正文塊開(kāi)始標(biāo)志#defineMBT_TAIL"{C:"http:///<報(bào)尾塊開(kāi)始標(biāo)志#defineMBT_FILE"{F:"http:///<文件說(shuō)明塊開(kāi)始標(biāo)志#defineMBT_BATHEADER"{B:"http:///<批量信息塊開(kāi)始標(biāo)志#defineTAG_PREFIX":"http:///<TAG名開(kāi)始標(biāo)志#defineTAG_SUFFIX":"http:///<TAG名結(jié)束標(biāo)志#defineMSGID_LEN20///<報(bào)文標(biāo)識(shí)號(hào)長(zhǎng)度(MSGID)#defineREQUESTID_LEN20///<報(bào)文參考號(hào)長(zhǎng)度(REQID)例:/**業(yè)務(wù)頭保留域長(zhǎng)度*/#defineCMTBH_RESERVED_LEN16例:/***@brief短報(bào)文正文體最大長(zhǎng)度。**此長(zhǎng)度應(yīng)根據(jù)MQCMT類定義最大消息長(zhǎng)度進(jìn)行調(diào)整,超過(guò)此長(zhǎng)度的報(bào)文應(yīng)分為多個(gè)報(bào)文片斷傳輸。**@par計(jì)算公式:*@code*最大長(zhǎng)度=MQCMT消息長(zhǎng)度-sizeof(CMTMsgHeader)-sizeof(CMTMsgTail)-sizeof(MQMsg)+1*=MQCMT最大消息長(zhǎng)度-175*@endcode*目前,MQCMT類定義的最大消息長(zhǎng)度為1M=1048576字節(jié)。*/#defineSHORT_MSGBODY_MAX_LEN1000000文檔注釋技巧為使doxygen工具能生成更好的文檔,編寫(xiě)文檔注釋時(shí)參考下列技巧:注釋中使用的標(biāo)識(shí)符前后均應(yīng)留一個(gè)空格,以便doxygen識(shí)別此標(biāo)識(shí)符,并自動(dòng)生成一個(gè)引用連接。如:/***…*@parCMT報(bào)文格式說(shuō)明:*-CMT報(bào)文由報(bào)頭(CMTMsgHeader)、可選的批量業(yè)務(wù)頭(CMTBatHeader)、正文體、報(bào)尾(CMTMsgTail)組成。其中除正文體外,其余各塊都是定長(zhǎng)的;*-正文體由一個(gè)或多個(gè)業(yè)務(wù)塊組成。每個(gè)業(yè)務(wù)塊由一個(gè)定長(zhǎng)的業(yè)務(wù)頭(CMTBusinessHeader)與一個(gè)變長(zhǎng)正文塊(CMTBusinessData)組成;*-正文塊(CMTBusinessData)由一個(gè)或多個(gè)TAG碼:TAG值對(duì)(報(bào)文域)組成,部分TAG值又可由多個(gè)定長(zhǎng)子域組成;*-正文體可放置在報(bào)文中,也可存儲(chǔ)在文件中,而在報(bào)文中僅放置文件名;*-當(dāng)正文體在文件中,則說(shuō)明批量業(yè)務(wù)頭、業(yè)務(wù)頭、正文塊存儲(chǔ)在文件中。*/注釋中可使用HTML標(biāo)記美化最終文檔,但別濫用美化標(biāo)記;較長(zhǎng)的文檔注釋需要分段說(shuō)明時(shí),使用<br>分段。如果需要段首縮進(jìn)兩字符,使用全角的空格。文檔注釋中可以使用@par增加一個(gè)小節(jié),靈活使用此標(biāo)記可以任意地?cái)U(kuò)展文檔的結(jié)構(gòu),滿足特殊描述的需要。如:/***…**@par算法原理:*計(jì)算機(jī)內(nèi)部運(yùn)算使用的基數(shù)是2,即滿2進(jìn)位。如果計(jì)算機(jī)字長(zhǎng)為32位,則最大可以表示的整數(shù)為4294967296.<br>*為了突破計(jì)算機(jī)最大整數(shù)的限制,可以采取兩種做法,一是擴(kuò)大基數(shù),二是增加字長(zhǎng)。*根據(jù)此原理,本類使用65536作為基數(shù),每個(gè)整數(shù)的最大位數(shù)10(unsignedintarray[10]),*因此可以最大整數(shù)是65536的10次方,約1.4e48。通過(guò)變更基數(shù)或位數(shù),本類理論上可以處理的任意整數(shù)。*/需要生成圓點(diǎn)列表時(shí)使用-,需要生成編號(hào)列表時(shí)使用-#。需要特別說(shuō)明一段文字,可以使用@code/@endcode。如:*@par計(jì)算公式:*@code*最大長(zhǎng)度=MQCMT消息長(zhǎng)度-sizeof(CMTMsgHeader)-sizeof(CMTMsgTail)-sizeof(MQMsg)+1*=MQCMT最大消息長(zhǎng)度-175*@endcode為使doxygen正確生成函數(shù)或方法的連接,注釋中的函數(shù)名或方法名前后應(yīng)留一個(gè)空格。如該函數(shù)或方法沒(méi)有重載,則不必使用參數(shù)列表,如GetTag()。如該函數(shù)或方法重載,則應(yīng)必須使用參數(shù)(類型)列表,如GetTag(LPCSTR,AMOUNT&,BOOL,int,int)。語(yǔ)句塊注釋程序代碼主要流程、重要算法以及邏輯性較強(qiáng)的代碼和有特殊設(shè)計(jì)意圖的代碼(如沒(méi)有break的case塊、空循環(huán)體、空語(yǔ)句塊)等位置,應(yīng)添加語(yǔ)句塊注釋。通過(guò)語(yǔ)句塊注釋,應(yīng)能反映程序功能的概貌,注釋量不應(yīng)少于該模塊概要設(shè)計(jì)的流程描述量。語(yǔ)句塊注釋?xiě)?yīng)遵循下列原則:應(yīng)使用斷行注釋,即//;一目了然的語(yǔ)句不應(yīng)注釋;每個(gè)分支、每個(gè)功能段均應(yīng)注釋;應(yīng)放置在緊臨該語(yǔ)句塊上方或語(yǔ)句右側(cè),與其上方的語(yǔ)句塊應(yīng)留一空行,禁止放置在語(yǔ)句塊的下方,但可以在語(yǔ)句塊下方放置該語(yǔ)句塊結(jié)束的注釋。放置在語(yǔ)句右側(cè)的注釋垂直方向盡量對(duì)齊,縮進(jìn)位置與語(yǔ)句塊相同。例:主要流程注釋 //參數(shù)檢查if(nInpLen==0||byInpData==NULL) {//檢查失敗 strOutStr.Empty(); return; }//清除行計(jì)數(shù)staticintnLineChars=0;//輸出的行長(zhǎng)度計(jì)數(shù)if(bResetLineChars){//行計(jì)數(shù)復(fù)位nLineChars=0;}//計(jì)算輸出長(zhǎng)度intnOutLen=2*4*(nInpLen/3+1);//考慮到要添加回車換行,多分配點(diǎn)空間char*p=strOutStr.GetBufferSetLength(nOutLen);memset(p,0,nOutLen);例:邏輯性較強(qiáng)//1.BankCode+PasswordCStringstrWrkStr=sWrkBankCode+sWrkPassword;//2.計(jì)算MD5指紋CStringstrMD5=md5.HashBuffer((BYTE*)strWrkStr.GetBuffer(0),strWrkStr.GetLength());//3.選取八位數(shù)字指紋char*p=strMD5.GetBuffer(0);charsTmpStr[17];intii=0;memset(sTmpStr,0,sizeof(sTmpStr));for(ii=0;ii<8;++ii)sTmpStr[2*ii]=p[4*ii+ii%4];//4.組合固定串p="AUTHBEPS";for(ii=0;ii<8;++ii)sTmpStr[2*ii+1]=p[ii];例:特殊設(shè)計(jì)意圖BigInt::~BigInt(){//NOTHING}switch(atoi(stCCSV0313_data.szOPERSTATUS)){case1://已付款execsqlupdateCISCODT0702setPAYCNT=:stCCSV0313_data.szCountwhereWORKDATE=:stCCSV0313_data.szWorkDateandCLSCODE=:stCCSV0313_data.szBankTypeandRSTYPE=:stCCSV0313_data.szRSTYPE andARSTSIGN=:stCCSV0313_data.szARSTSIGNandCGTYPE=:stCCSV0313_data.szCGTYPE;CheckDBError("CISCODT0702",E_DB_UPDATE);break;case2://已退票execsqlupdateCISCODT0702setRTNCNT=:stCCSV0313_data.szCountwhereWORKDATE=:stCCSV0313_data.szWorkDateandCLSCODE=:stCCSV0313_data.szBankTypeandRSTYPE=:stCCSV0313_data.szRSTYPE andARSTSIGN=:stCCSV0313_data.szARSTSIGNandCGTYPE=:stCCSV0313_data.szCGTYPE;CheckDBError("CISCODT0702",E_DB_UPDATE);break;default://DONOTHINGbreak;}需要注釋一段代碼時(shí),避免使用/**/注釋,而應(yīng)使用#ifdef0…#endif形式,因此這種形式可以嵌套。如:例:#ifdef0//直接解析批量包報(bào)文(一次讀取一個(gè)塊)intCMTFileOperator::ParseMessage(CMTPkgMsg&msg,intnMaxCount,BOOLbNoDetail){BOOLbMustData=FALSE;CStringstrWrkStr;intnRetCount=0;while(1){ReadBlock(strWrkStr,bNoDetail);if(strWrkStr.IsEmpty())break;//正文塊檢查if(bMustData&&strncmp(strWrkStr,MBT_BUSINESSDATA,strlen(MBT_BUSINESSDATA))!=0){THROW_OUT(E_NEEDBUSIDATA,"");}elsebMustData=FALSE;//其他報(bào)文塊//目前沒(méi)有這樣的塊,做錯(cuò)塊CStrings;s.Format("位置在文件第(%ld)字節(jié)",m_hFile.GetPos()-strWrkStr.GetLength());THROW_OUT(E_UNKNOWBLOCK,s);/*CStringsTmpFileName;*sTmpFileName.GetBufferSetLength(strWrkStr.GetLength()-strlen(MBT_FILE)-strlen(MBT_SUFFIX));*strncpy(sTmpFileName.GetBuffer(0),strWrkStr.GetBuffer(0)+strlen(MBT_FILE),strWrkStr.GetLength()-strlen(MBT_FILE)-strlen(MBT_SUFFIX));*//自動(dòng)解析文件*ClearFailStatus();*msg.Patch(strWrkStr);*ExitOnFail();*/}return0;}#endif代碼維護(hù)注釋維護(hù)已經(jīng)定版的代碼時(shí),禁止直接刪除或編輯舊代碼,而應(yīng)使用注釋保留舊代碼,然后在舊代碼下方增加新修改后的代碼。代碼維護(hù)注釋?xiě)?yīng)放置到被修改代碼的上方,使用斷行注釋,并應(yīng)注明修改日期、修改人、修改原因。對(duì)代碼塊進(jìn)行修改的,還應(yīng)標(biāo)明修改結(jié)束的位置。代碼維護(hù)注釋?xiě)?yīng)從行首開(kāi)始,不必縮進(jìn)。例:注銷舊代碼//2005-04-13lnydelete:將此函數(shù)遷移到commexception.cpp文件。#ifdef0//支持異常處理的系統(tǒng),直接拋出錯(cuò)誤voidThrowMsgException(intiCode,LPCSTRlpTagName,LPCSTRlpErrText){CStrings;if(lpErrText!=NULL)s=lpErrText;if(lpTagName!=NULL)s=s+"("+lpTagName+")";ThrowException(iCode,s);}#endif例:修改舊代碼//清空數(shù)據(jù)Clean(FALSE);//解讀報(bào)文塊//2005-09-02lnymodify:增加自動(dòng)讀取報(bào)體文件功能。//returnPatch(pMsg);if(IsEmptyStr(pMsg))return0;例:增加新代碼//2005-09-02lnyappend:增加自動(dòng)讀取報(bào)體文件功能。intnRetCode=Patch(pMsg);if(nRetCode!=0)returnnRetCode;if(m_bBodyInFile&&bAutoReadBodyFile){//Autoreadthebodyfile.CBuffedFilereader;if(!reader.Open(m_strFileName,FALSE,FALSE)){CStringstr;str.Format("打開(kāi)報(bào)文體文件[%s]失敗!",m_strFileName.GetBuffer(0));THROW_OUT(E_NEEDBUSIDATA,str);}…}return0;//2005-09-02lnyappendend.}編碼風(fēng)格排版風(fēng)格縮進(jìn)與對(duì)齊程序代碼排版應(yīng)采用縮進(jìn)風(fēng)格編寫(xiě)程序,每層縮進(jìn)一個(gè)制表位(TAB)或四個(gè)空格。應(yīng)用程序全部代碼應(yīng)保持一致,要么使用TAB,要么使用四個(gè)空格,不應(yīng)混用。左花括號(hào)({)單獨(dú)占一行且與右花括號(hào)(})對(duì)齊。例:if(!IsQuit()){exit(0);}應(yīng)書(shū)寫(xiě)為:if(!IsQuit()){exit(0);}每行只定義一個(gè)變量或包含一個(gè)語(yǔ)句。例:intnRetCode,nMaxLen;應(yīng)書(shū)寫(xiě)為:intnRetCode;intnMaxLen;超長(zhǎng)的語(yǔ)句(>80字符)或表達(dá)式應(yīng)分成多行書(shū)寫(xiě)。語(yǔ)句應(yīng)在逗號(hào)分隔符處劃分新行;表達(dá)式應(yīng)在低優(yōu)先級(jí)操作符處劃分新行,操作符放在新行之首。劃分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊,語(yǔ)句易讀。例:if(!IsNumberString(stCIS410Detail.sBankCode)||strlen(stCIS410Detail.sBankCode)!=12||strcmp(stCIS410Detail.sBankCode,stCIS410Detail.sOrgBankCode)==0)應(yīng)書(shū)寫(xiě)為:If(!IsNumberString(stCIS410Detail.sBankCode)||strlen(stCIS410Detail.sBankCode)!=12||strcmp(stCIS410Detail.sBankCode,stCIS410Detail.sOrgBankCode)==0)THROW_OUT(E_INVALIDLIST,StrPrint("票交機(jī)構(gòu)行別非數(shù)字或長(zhǎng)度非3位![%s]",stCIS410Detail.sClsCode).GetBuffer(0));應(yīng)書(shū)寫(xiě)為:THROW_OUT(E_INVALIDLIST,StrPrint("票交機(jī)構(gòu)行別非數(shù)字或長(zhǎng)度非3位![%s]",stCIS410Detail.sClsCode).GetBuffer(0));對(duì)結(jié)構(gòu)的多個(gè)數(shù)據(jù)成員賦值時(shí),將等號(hào)對(duì)齊。例:rect.top=0;rect.left=0;rect.right=300;rect.bottom=200;應(yīng)書(shū)寫(xiě)為:rect.top=0;rect.left=0;rect.right=300;rect.bottom=200;定義多個(gè)宏或初始化多個(gè)變量時(shí),將值對(duì)齊。例:#defineMBT_PREFIX"{"http:///<報(bào)文塊開(kāi)始標(biāo)志#defineMBT_SUFFIX"}"http:///<報(bào)文塊結(jié)束標(biāo)志#defineMBT_HEADER"{1:"http:///<報(bào)頭塊開(kāi)始標(biāo)志#defineMBT_BUSINESSHEADER"{2:"http:///<業(yè)務(wù)頭塊開(kāi)始標(biāo)志#defineMBT_BUSINESSDATA"{3:"http:///<正文塊開(kāi)始標(biāo)志#defineMBT_TAIL"{C:"http:///<報(bào)尾塊開(kāi)始標(biāo)志#defineMBT_FILE"{F:"http:///<文件說(shuō)明塊開(kāi)始標(biāo)志#defineMBT_BATHEADER"{B:"http:///<批量信息塊開(kāi)始標(biāo)志#defineTAG_PREFIX":"http:///<TAG名開(kāi)始標(biāo)志#defineTAG_SUFFIX":"http:///<TAG名結(jié)束標(biāo)志應(yīng)書(shū)寫(xiě)為:#defineMBT_PREFIX"{"http:///<報(bào)文塊開(kāi)始標(biāo)志#defineMBT_SUFFIX"}"http:///<報(bào)文塊結(jié)束標(biāo)志#defineMBT_HEADER"{1:"http:///<報(bào)頭塊開(kāi)始標(biāo)志#defineMBT_BUSINESSHEADER"{2:"http:///<業(yè)務(wù)頭塊開(kāi)始標(biāo)志#defineMBT_BUSINESSDATA"{3:"http:///<正文塊開(kāi)始標(biāo)志#defineMBT_TAIL"{C:"http:///<報(bào)尾塊開(kāi)始標(biāo)志#defineMBT_FILE"{F:"http:///<文件說(shuō)明塊開(kāi)始標(biāo)志#defineMBT_BATHEADER"{B:"http:///<批量信息塊開(kāi)始標(biāo)志#defineTAG_PREFIX":"http:///<TAG名開(kāi)始標(biāo)志#defineTAG_SUFFIX":"http:///<TAG名結(jié)束標(biāo)志m_bIsConnected=FALSE;m_bDoConnect=FALSE;MQODod={MQOD_DEFAULT};應(yīng)書(shū)寫(xiě)為:m_bIsConnected=FALSE;m_bDoConnect=FALSE;MQODod={MQOD_DEFAULT};if、for、do、while、case、switch、default等語(yǔ)句獨(dú)占一行,且if、for、do、while等語(yǔ)句的執(zhí)行部分總要加括號(hào){}。例:if(!IsQuit())exit(0);應(yīng)書(shū)寫(xiě)為:if(!IsQuit()){exit(0);}定義指針或引用時(shí),*與&應(yīng)緊靠其類型而非變量。例:int*p=&nRetCode;CString&str=strOldName;應(yīng)書(shū)寫(xiě)為:int*p=&nRetCode;CString&str=strOldName;空格與空行相鄰兩個(gè)功能相對(duì)獨(dú)立的代碼塊間應(yīng)使用空行隔開(kāi)。例:MQMDmd={MQMD_DEFAULT};memcpy(&m_md,&md,sizeof(md));m_md.Version=MQOD_VERSION_2;MQPMOpmo={MQPMO_DEFAULT};memcpy(&m_pmo,&pmo,sizeof(pmo));m_pmo.Version=MQOD_VERSION_2;MQGMOgmo={MQGMO_DEFAULT};memcpy(&m_gmo,&gmo,sizeof(gmo));m_gmo.Version=MQOD_VERSION_2;應(yīng)書(shū)寫(xiě)為:MQMDmd={MQMD_DEFAULT};memcpy(&m_md,&md,sizeof(md));m_md.Version=MQOD_VERSION_2;MQPMOpmo={MQPMO_DEFAULT};memcpy(&m_pmo,&pmo,sizeof(pmo));m_pmo.Version=MQOD_VERSION_2;MQGMOgmo={MQGMO_DEFAULT};memcpy(&m_gmo,&gmo,sizeof(gmo));m_gmo.Version=MQOD_VERSION_2;變量申明之后應(yīng)使用空行與代碼隔開(kāi)。例:MQMsgInfomqMsg;mqMsg.m_strMsgId=strMsgId;mqMsg.m_nPriority=nPriority;mqMsg.m_iFeedback=iFeedbackCode;mqMsg.m_pBuffer=(LPTSTR)sMsgStr;mqMsg.m_nDataLen=nMsgLen;mqMsg.m_iSegmentFlag=iSegmentFlag;if(iFeedbackCode==MFBC_NONE)mqMsg.m_iMsgType=MT_NORMAL;elsemqMsg.m_iMsgType=MT_REPORT;應(yīng)書(shū)寫(xiě)為:MQMsgInfomqMsg;mqMsg.m_strMsgId=strMsgId;mqMsg.m_nPriority=nPriority;mqMsg.m_iFeedback=iFeedbackCode;mqMsg.m_pBuffer=(LPTSTR)sMsgStr;mqMsg.m_nDataLen=nMsgLen;mqMsg.m_iSegmentFlag=iSegmentFlag;if(iFeedbackCode==MFBC_NONE)mqMsg.m_iMsgType=MT_NORMAL;elsemqMsg.m_iMsgType=MT_REPORT;函數(shù)返回語(yǔ)句要和其他語(yǔ)句用空行分開(kāi)。例:ptr->m_chMsgType=MQ_MT_TAIL;iSegmentFlag=SF_LASTSEGMENT;strncpy(ptr->m_pBody,(char*)pTail,sizeof(CMTTailMap));returnPut((LPCSTR)ptr,strMsgId,sizeof(MQMsg)+sizeof(CMTTailMap)-1,iSegmentFlag,nPriority,iFeedbackCode);應(yīng)書(shū)寫(xiě)為:ptr->m_chMsgType=MQ_MT_TAIL;iSegmentFlag=SF_LASTSEGMENT;strncpy(ptr->m_pBody,(char*)pTail,sizeof(CMTTailMap));returnPut((LPCSTR)ptr,strMsgId,sizeof(MQMsg)+sizeof(CMTTailMap)-1,iSegmentFlag,nPriority,iFeedbackCode);比較操作符,賦值操作符,算術(shù)操作符,邏輯操作符,位域操作符等雙目運(yùn)算符前后應(yīng)加空格與操作數(shù)隔開(kāi)。例:i=i+1;if(i>10)i=(i>>2);應(yīng)書(shū)寫(xiě)為:i=i+1;if(i>10){i=(ii>>2);}逗號(hào)、分號(hào)后面應(yīng)加空格,但前面不應(yīng)加空格。例:for(intii=0;ii<10;ii++)應(yīng)書(shū)寫(xiě)為:for(intii=0;ii<10;ii++)在關(guān)鍵字和其后的括號(hào)之間加一個(gè)空格。例:if(i>10)for(ii=0;ii<10;ii++)應(yīng)書(shū)寫(xiě)為:if(i>10)for(ii=0;ii<10;ii++)單目運(yùn)算符不應(yīng)加空格與操作數(shù)隔開(kāi)。例:while(!IsQuit()){ii++;a[ii]=a[ii]+1;}應(yīng)書(shū)寫(xiě)為:while(!IsQuit()){ii++;a[ii]=a[ii]+1;}函數(shù)名與括號(hào)間、結(jié)構(gòu)或類與成員間、左括號(hào)后、右括號(hào)前、不應(yīng)加空格。例:CStringstr=stSet.GetName(strOrgName);if(str=="uname"){pOldSet->m_nName=str;}應(yīng)書(shū)寫(xiě)為:CStringstr=stSet.GetName(strOrgName);if(str=="uname"){pOldSet->m_nName=str;}括號(hào)使用復(fù)雜的表達(dá)式應(yīng)使用括號(hào)以避免二義性,不應(yīng)依賴運(yùn)算符優(yōu)先級(jí)。如:if((i>0)||(i<=-12))、(p++)+1。位運(yùn)算時(shí)應(yīng)使用括號(hào),如:i=(nSumVal<<4)。return與throw非函數(shù),不應(yīng)使用括號(hào)。如:returnnRetCode。頭文件頭文件應(yīng)使用防止重復(fù)包含宏括整個(gè)頭文件部分。宏名應(yīng)為_(kāi)_模塊名_HPP__或__模塊名_H__。注意:#endif后必須保留一個(gè)空行,否則部分編譯器會(huì)報(bào)警告信息。本模塊需要的頭文件以及外部函數(shù),應(yīng)全部列在本模塊頭文件的首部且緊臨防重復(fù)包含宏,并按先系統(tǒng)級(jí)、公共級(jí)、應(yīng)用級(jí)、本模塊級(jí)的順序擺放。盡量不在實(shí)現(xiàn)文件中包含除本模塊頭文件外的其他頭文件以及外部函數(shù)。頭文件引用禁止含路徑信息,無(wú)論是全路徑還是相對(duì)路徑。禁止在頭文件中定義變量或常量。例:頭文件cis401.hpp#ifndef__MODULE_NAME_HPP__#define__MODULE_NAME_HPP__#include<stdio.h>#include"/PUBLIB/src/include/common.hpp"#include"../include/cispub.hpp"intg_nUserCode=0;…#endif例:實(shí)現(xiàn)文件cis401.cpp#include<string.hpp>#include"cstring.hpp"#include"../include/cis401.hpp"externlongGetFileSize(LPCSTRsFileName);…cis401.hpp應(yīng)書(shū)寫(xiě)為:#ifndef__MODULE_NAME_HPP__#define__MODULE_NAME_HPP__#include<stdio.h>#include<string.hpp>#include"common.hpp"#include"cstring.hpp"#include"cispub.hpp"externlongGetFileSize(LPCSTRsFileName);externintg_nUserCode;…#endifcis401.cpp應(yīng)書(shū)寫(xiě)為:#include"cis401.hpp"intg_nUserCode=0;…宏定義靈活使用編譯宏解決平臺(tái)或版本的兼容性問(wèn)題。例:.cpp#ifdefWIN32//inWIN32voidprintTrace(LPCSTRlpName,LPCSTRlpText,...){charszTmp[4096];memset(szTmp,0,sizeof(szTmp));va_listargList;va_start(argList,lpText);_vsprintf(szTmp,lpText,argList);va_end(argList);fprintf(stderr,"[%s]%s:%s\n",StrCurrentTime("YYYY-MM-DDHH:MM:SS").GetBuffer(0),lpName,szTmp);}#else//inUNIXvoidprintTrace(LPCSTRlpName,LPCSTRlpText,...){charszTmp[4096];memset(szTmp,0,sizeof(szTmp));va_listargList;va_start(argList,lpText);vsprintf(szTmp,lpText,argList);va_end(argList);fprintf(stderr,"[%s]%s:%s\n",StrCurrentTime("YYYY-MM-DDHH:MM:SS").GetBuffer(0),lpName,szTmp);}#endif應(yīng)修改為:.hpp#ifdefWIN32#definevsprintf_vsprintf#endif.cppvoidprintTrace(LPCSTRlpName,LPCSTRlpText,...){charszTmp[4096];memset(szTmp,0,sizeof(szTmp));va_listargList;va_start(argList,lpText);vsprintf(szTmp,lpText,argList);va_end(argList);fprintf(stderr,"[%s]%s:%s\n",StrCurrentTime("YYYY-MM-DDHH:MM:SS").GetBuffer(0),lpName,szTmp);}宏表達(dá)式的變量應(yīng)使用括號(hào)括,使用宏時(shí)應(yīng)避免傳遞表達(dá)式給宏變量。例:#defineMAX(a,b)(a>b)?a:b應(yīng)書(shū)寫(xiě)為:#defineMAX(a,b)(((a)>(b))?(a):(b))調(diào)用:intnMax=MAX(i++,b++);應(yīng)書(shū)寫(xiě)為:intnTmpi=i++;intnTmpb=b++;intnMax=MAX(nTmpi,nTmpb);單條語(yǔ)句構(gòu)成的宏不應(yīng)使用分號(hào)作為宏結(jié)束;多條語(yǔ)句構(gòu)成宏時(shí),應(yīng)使用花括號(hào)括宏體。例:#defineThrowExceptionExt(sFileName,nErrCode,sExtMsg)\ThrowFileExceptionExt(__FILE__,__LINE__,sFileName,nErrCode,sExtMsg);returnnErrCode#defineRETCODE(n)returnn;應(yīng)書(shū)寫(xiě)成:#defineThrowExceptionExt(sFileName,nErrCode,sExtMsg)\{\ThrowFileExceptionExt(__FILE__,__LINE__,sFileName,nErrCode,sExtMsg);\returnnErrCode;\}#defineRETCODE(n)returnn構(gòu)成宏體的語(yǔ)句必須完成,禁止包含語(yǔ)句塊的部分。例:#defineCLEAR_ALL(n)for(intii=0;ii<n;ii++)…CLEAR_ALL(strlen(str)){str[ii]=0;}#defineCLEAR_ALL(n)\{\for(intii=0;ii<(n);ii++)\{\str[ii]=0;\}\}以上兩例應(yīng)書(shū)寫(xiě)為:#defineCLEAR_ALL(str,n)\{\for(intii=0;ii<(n);ii++)\{\str[ii]=0;\}\}/*即使這樣,代碼依然是不安全的。應(yīng)避免在宏中定義變量*/禁止使用宏替換關(guān)鍵字,如下列為不良寫(xiě)法。#defineMYENUMenumMYENUMerr{E_DATE=1,E_TIME=2}使用enum或constint或inline函數(shù)代替宏。例:#defineMAX_FRAME_SIZE1024#defineERR_DATE1#defineERR_TIME2#defineERR_TASK_NO3#defineExitOnFail(){if(g_nErrCode!=0)returng_nErrCode;}應(yīng)書(shū)寫(xiě)為:constintMAX_FRAME_SIZE=1024;enumERR_TYPE{ERR_DATE=1,ERR_TIME=2,ERR_TASK_NO=3}inlineintExitOnFail(){if(g_nErrCode!=0){returng_nErrCode;}}變量與常量避免使用與全局變量、外部變量同名的局部變量;禁止使用關(guān)鍵字、保留字、函數(shù)名作為變量名。如下列為不良寫(xiě)法:例:intnMaxSize=100;intstrlen=1;for(intii=0;ii<10;ii++){ intnMaxSize=ii+strlen; strlen++; printf("===%d\n",strlen);}總在定義變量時(shí)指定其初始值,無(wú)論此變量是全局變量、靜態(tài)變量還是局部變量。避免使用沒(méi)有初始化的變量。盡量使用const修飾可能的變量,這可以避免很多書(shū)寫(xiě)錯(cuò)誤。注意區(qū)分const的位置,constchar*p、char*constp、constchar*constp分別代表指針p指向常量串、常量指針p指向串、常量指針p指向常量串。而constint與intconst則是相同的含義。盡可能少使用全局變量。給全局變量指定值時(shí)注意值域范圍,避免值越界。使用無(wú)符號(hào)數(shù)聲明位域變量。例:typedefstruct{intbit0:1;intbit1:1;intbit2:1;intbit3:1;intbit4:1;intbit5:1;intbit6:1;intbit7:1;}BITS;BITSstBits;stBits.bit0=1;stBits.bit1=2;stBits.bit2=3;printf("%d%d%d\n",stBits.bit0,stBits.bit1,stBits.bit2);//期望輸出:101,但實(shí)際輸出是:-10-1。應(yīng)書(shū)寫(xiě)為:typedefstruct{unsignedintbit0:1;unsignedintbit1:1;unsignedintbit2:1;unsignedintbit3:1;unsignedintbit4:1;unsignedintbit5:1;unsignedintbit6:1;unsignedintbit7:1;}BITS;…使用專門的初始化函數(shù)對(duì)所有的公共變量進(jìn)行初始化。代碼中的數(shù)值應(yīng)盡量使用有意義的標(biāo)識(shí)符代替。例:doubledArea=3.14*dRadii*dRadii;應(yīng)書(shū)寫(xiě)為:constdoublePI=3.14;doubledArea=PI*dRadii*dRadii;充分使用C++的特性,在使用局部變量前,盡可能晚地定義它,并應(yīng)增加注釋說(shuō)明。不要復(fù)用一個(gè)變量。每個(gè)變量用途應(yīng)明確,頻繁變更用途容易讓人迷惑。例:intnReadSize=0;nReadSize=oReader.Read(psBuffer,10240);if(nReadSize==10240){nReadSize=CallProcess(psBuffer);if(nReadSize!=0)returnnReadSize;}應(yīng)書(shū)寫(xiě)為:intnReadSize=0;nReadSize=oReader.Read(psBuffer,10240);if(nReadSize==10240){intnRetCode=CallProcess(psBuffer);if(nRetCode!=0)returnnRetCode;}使用靜態(tài)變量或動(dòng)態(tài)分配內(nèi)存代替大局部變量(字節(jié)數(shù)超過(guò)4k),避免占用太多堆棧空間,但應(yīng)注意靜態(tài)局部變量是非重入安全的。注意變量的值域范圍,避免值溢出或丟失精度。例:下溢導(dǎo)致死循環(huán)unsignedcharc=127;unsignedcharn=10;while(n>=0){n--;c++;}應(yīng)書(shū)寫(xiě)為:unsignedintc=127;charn=10;while(n>=0){n--;c++;}不要將常量強(qiáng)制轉(zhuǎn)換為變量,有時(shí)可能導(dǎo)致系統(tǒng)崩潰。條件判斷if語(yǔ)句的判斷條件必須是邏輯表達(dá)式,不應(yīng)使用C++默認(rèn)的0為false,非0為true的規(guī)則。如:例:char*p=strstr("abc","a");if(p){…;}應(yīng)書(shū)寫(xiě)為:char*p=strstr("abc","a");if(p==NULL){…;}char*p=str;while(*p){p++;}應(yīng)書(shū)寫(xiě)為:char*p=str;while(*p!=0){p++;}for(intii=10;ii;ii--)應(yīng)書(shū)寫(xiě)為:for(intii=10;ii>0;ii--)禁止對(duì)邏輯表達(dá)式進(jìn)行比較操作。如:例:if((ii>10)||(bQuit==TRUE)||IsContinue()==FALSE){…;}應(yīng)書(shū)寫(xiě)成:if((ii>10)||bQuit||!IsContinue()){…;}避免對(duì)浮點(diǎn)類型作等于或不等于判斷,應(yīng)根據(jù)應(yīng)用的實(shí)際情況使用范圍判斷。如:金額的小數(shù)位為兩位,則判斷金額是否為零,可以寫(xiě)成:if(dAmount<0.0001&&dAmount>-0.0001)??臻g申請(qǐng)與釋放使用C++的new操作符申請(qǐng)空間,使用delete操作符釋放空間,new[]申請(qǐng)的數(shù)組空間,應(yīng)使用delete[]釋放。申請(qǐng)空間后、釋放空間前,應(yīng)判斷指針是否為NULL;釋放空間后應(yīng)賦值該指針為NULL,避免重復(fù)釋放空間。盡量在申請(qǐng)空間的函數(shù)內(nèi)部釋放空間,否則應(yīng)妥善傳遞申請(qǐng)的空間指針,并在合適的時(shí)間釋放,避免內(nèi)存泄漏。函數(shù)編寫(xiě)仔細(xì)選擇函數(shù)的參數(shù)并盡量減少參數(shù)個(gè)數(shù)。沒(méi)有參數(shù)時(shí)明確地使用void說(shuō)明;參數(shù)是數(shù)組類型的,使用數(shù)組類型而非指針類型;參數(shù)是類對(duì)象的,盡量使用對(duì)象的引用或?qū)ο笾羔槪粎?shù)是大數(shù)據(jù)變量的,必須使用引用或指針;可默認(rèn)值的參數(shù)盡量指定默認(rèn)值。函數(shù)入口點(diǎn)應(yīng)檢查每個(gè)參數(shù)的合法性。仔細(xì)安排參數(shù)的位置,最常用的參數(shù)放置在最前面,輸入?yún)?shù)盡量放置在左邊,輸出參數(shù)盡量放置在右邊。顯式聲明函數(shù)的返回值,沒(méi)有返回值的使用void說(shuō)明。返回指針的函數(shù),使用NULL作為錯(cuò)誤返回。禁止返回局部變量的指針或引用。必須完整處理函數(shù)返回碼,并預(yù)留通用返回碼的處理,避免新增加的返回碼被忽略。例:intnRetCode=CheckBusiness();if(nRetCode==-1){…return;}if(nRetCode==-2){…return;}應(yīng)書(shū)寫(xiě)為:intnRetCode

溫馨提示

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

評(píng)論

0/150

提交評(píng)論