2024C++語言編程規(guī)范_第1頁
2024C++語言編程規(guī)范_第2頁
2024C++語言編程規(guī)范_第3頁
2024C++語言編程規(guī)范_第4頁
2024C++語言編程規(guī)范_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C++第第2/37 附錄 附錄 第PAGE第10/37【原則【原則【原則《重構——改進現(xiàn)有代碼的設計》一書中說到重復是代碼中最大的壞味道,會帶來維護上的困難。編寫代碼應1-4】盡量減少同樣的錯誤??2-1】程序的分界符‘{’和‘}’應獨占一行并且位于同一列,同時與引用它們的語句左對齊。{}之內的2-2】聲明類的時候,public、protected、private關鍵字與分界符{}對齊,這些部分的內容要進行縮2-3】if、else、elseif、for、while、do等語句自占一行,執(zhí)行語句不得緊跟其后。不論執(zhí)行語句有多少都要加{}。Copyright(c)2003-2012ZTESoftTechnologyAllrights說明:說明:Public,protected,private按照順序編寫,先函數(shù)后成員變量。先描述函數(shù)對外接口,構【規(guī)則說明:為了避免此文件被重復包含,而引起編譯錯誤。說明:為了避免此文件被重復包含,而引起編譯錯誤。C++是不允許一個類被多次定義,即使2-8】包含標準庫頭文件用尖括號,包含非標準庫頭文件用雙引號【規(guī)則說明:說明://Ur:98723可以加一些簡單的描述【規(guī)則 class enum /// /// ///枚舉,標志黃色 ///變量的說明2-11】宏、常量名必須使用大寫字母,用下劃線‘_’分割單詞。預編譯開關的定義使用下劃線‘_’開2-12+“名詞”或者“形容詞+名詞”,2-13 : : : : :unsignedchar或BYTE :long :long : :pointerto : : :unsignedshort或WORDdw:DWORD或unsignedlong :數(shù)組,arrayofTYPE:字符串:結構類型:對象:struct: :全局變量:字符串:結構類型:對象:struct: :全局變量 全局變量:longlong說明說明:對于protected,private變量加m_前綴是為了在類成員函數(shù)中同臨時函數(shù)變量和參數(shù)傳this->iSubsId們不建議將類的成員變量聲明為iSubsId變量說明boolm_bFlag變量說明【規(guī)則voidintcount,Count,COUNT;charsName[16],sNAme[32];voidinta=ifif(a>printf(“a>printf(“a<=設置縮進:工具>選項>文本編輯器>C/C++>制表符>將兩個值統(tǒng)一設成4。在UE中,可以通過:高級>配置>編輯器>自動換行/【規(guī)則2-17】對于一個類的聲明為public,protected函數(shù),請附加詳細的說明,包括函數(shù)的功能,參數(shù),返see、note、verbatim的關鍵字視實際情況填寫。特別的,Python接口函數(shù)必須嚴格遵守此條。人員閱讀代碼會帶來很大的方便。而且可以通過doxgen根據(jù)約定注釋生成文檔。 @parampszFrom @paramnSize @return staticchar*Fun(constchar*pszFrom,char*pszTo,size_t【規(guī)則2-18】源文件名遵循單詞首字母大寫,中間不??現(xiàn)下劃線,.h與對應的.cpp的名字一樣,禁止??現(xiàn)【規(guī)則2-3GoogleProtocolBuffer協(xié)議時,通過協(xié)議文件*.proto自動生成源代碼方式而不是中間代碼GoogleProtocolBufferGoogleProtocolBuffer協(xié)議時,源代碼中不應保留*.pb.cc/h的中間文件,只需要保留*.proto文件,編譯時自動生成*.pb.cc/h。避免??現(xiàn)協(xié)議變更而中間代碼未同步導致的人為錯file(GLOBPROTO_INPUTforeach(PROTO_FILE${PROTO_INPUT})get_filename_component(PROTO_NAME${PROTO_FILE}NAME_WE)OUTPUTDEPENDS${PROTOC}${PROTO_FILE}WORKING_DIRECTORY${CMAKE_CURRENT_BINARY_DIR}跨平臺,可以生成native編譯配置文件。在linux/unix平臺可以生成makefile,在mac平臺可以生成xcode,在windows平臺可以生成msvc工程的配置文件。 【規(guī)則件下,否則不建議使用static變量。說明:說明:voidFun(constTBaseObject*象,則宜改用“const&”方式來傳遞,這樣可以省去臨時對象的構造和析構過程,從而提高效率。說明:對于系統(tǒng)內置的類型,包括說明:對于系統(tǒng)內置的類型,包括intlongdouble,floatcharbool等,如果輸入?yún)?shù)以值傳遞);//);//【規(guī)則compNoteCPPCHECK已經(jīng)支持fopen/fread/fseek/fwrite/rename/readdir/system檢測,本次補充警或cppcheck檢查。警或cppcheck檢查?!疽?guī)則ifif //flagif //flagif(value==0)if(value!=if((x>=-EPSINON)&&//其中EPSINON是允許的誤差(即精度現(xiàn)場資費為3700/60,用戶賬本余額-2035,剛好夠使 用量33s,算費結果也是扣2035,但是由于C++浮點 數(shù)的誤差,在系統(tǒng)中保存的可能是2035.0000000...1 度。最終對ceil的操作,代碼修改為:ifp p與NULL顯式比較,強調pif(p!=if(c //強調cif(c!=iNewFee=elseif(dOldFee>=0)iNewFee=iNewFee=(-1)*ifiAdjustMethodCEIL//if(dOldFee>=0)iNewFee=ceil(dOldFee);elseiNewFee=(-1)*ceil(ABS(dOldFee));【規(guī)則3-12】在C++程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。避免使用"1.const常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型。編譯器可以對前者進行類型安全檢查。而對2.2.有些集成化的調試工具可以對const常量進行調試,但是不能對宏常量進行調試。如:constdoublePI=3.1415926;//PI值doubledNumber //doubledNumber //3-14gotogotogoto語句,會使程序結構難于理解,在gotogoto表達的語義,可以使用其他方式(順序、【規(guī)則978824doubleint類型的值,導致溢??為負值??梢钥紤]在AIX主機加-qinfo=trd重新編譯,會產生如下提示進行修改。"a.c",line5.3:1506-452(I)Assigningafloating-pointtypetoanintegraltypemayresultcast.cpp:10:warning:conversionto‘int’from‘double’mayalterits SPR在編程中具體應用。對于變量而言,每個變量只有一個用途。對于函數(shù)而言,每足SPR的函數(shù)實現(xiàn)業(yè)務邏輯,并遵循單一抽象層次原則。UR:1089991【規(guī)則3-17】單純的全局變量應該定義在實現(xiàn)文件(CPP/C)中,在頭文件中申明,從而避免因為多次包含3-18】函數(shù)(Python接口函數(shù))CleanCode說明:例如說明:例如gtest為了方便使用通過EXPECT_TRUE/EXPECT_FALSE,用名字表達含義而不3"1.因為業(yè)務調用參數(shù)錯位時導致bool向long轉換,而從低精度向高精度轉換,編譯器不會報2.另外函數(shù)參數(shù)較多達到5個,開發(fā)人員肉眼未核對??來,所以自測也未覆蓋到這種場景。"3-19反例:反例:constchar*TimeToString(time_ttTime)使用靜態(tài)數(shù)組返回時間串。日志中利用該函數(shù)同3-20】避免對const3-21charAIXunsignedcharlinuxsigned問題:問題:AIX是大端序,Linux是小端序;char在AIX系統(tǒng)中默認是unsignedchar,而在Linux中默認是有符號的。AIX下char默認是無符號類型 char的,存儲范圍是0-255,Linux下是signed char范圍是-127-127,導致了數(shù)據(jù)保存的差異,產生負值。lTmplTmp8|1charunsignedcharsignedchartmpValue[1024]={0}; 要改為unsignedchartmpValue[10240【建議【建議【建議3-4】優(yōu)先使用C++中的4種不同的類型轉換,包括static_castdynamic_castconst_cast,說明:說明:C++core的virtualvoidclassclassB:publicboolclassC:publicboolA*a=newB();A*a=newB*b=//這個時候,如果a的值為classC,那么任對classB中的操作將導致程序發(fā)生 b->m_bBFlag= //B*if((b=dynamic_cast<B*>a)==//這個時候,如果a的值為classC,將進入這個分支,【建議【建議3-6】在面向對象程序中,memset應該盡量少??現(xiàn),類的數(shù)據(jù)成員的初始化應該盡量依賴構造函數(shù)【規(guī)則說明說明:CPPdeletep=for(inti=0;i<n;deletep[i];p[i]=NULL;int*p=new delete[]p;voidint*p=newifdelete[]【規(guī)則行非空判斷,防止程序core,并根據(jù)代碼或業(yè)務需要,記錄相關??錯日志。TRatableEvent類中的成員指針,很多都不是在類內部分配和維護的,僅僅是則很容易引起程序core。4-6QMDB模塊以外的所有代碼中禁止向外層拋??throw關鍵字。在調用ORACLE、TT、QMDB等接口時應該在調用的地方及時的對異常進行捕獲(try…catch…。voidif可能檢查參數(shù), //無法及時對其進行捕獲處理。對于復雜的初始化工作應該放到Initialize()函數(shù)中去。m_pInsertAocAcm=newOdbcConfig):TRatingCtrlEngineBase(DBConfig,OdbcConfig)boolbReFlag=TRatingCtrlEngineBase::Initialize();m_pInsertAocAcm=new(nothrow)if(NULL==m_pInsertAocAcm)return-return對于C++來說,這種不完整的對象將被視為尚未完成創(chuàng)建動作而不被認可,也意味著其析構函C++不支持異常的異常,上述第二種情況將導致一個致命錯誤,并使程序中止執(zhí)行。4-10operatornewoperatordelete在C++標準(ISO/IEC14882:2003)第15.2節(jié)中明確規(guī)定,在使用new或new[]操作存在一個與使用的operatornew嚴格匹配的operatordelete,則為這個對象所分配的內存也會如果析構函數(shù)可能拋??deletetrycatch,若是捕捉到異常,則要再調用operatordelete釋放對象本身的內存。CSample*p1=newCSample;deletecatch(constsampleExp&CSample::operatordelete(p1);//釋放p1//使用err對象完成后續(xù)的錯誤處理catch來捕獲delete異常。【規(guī)則(catch(...)iRet= "exception=%s,sql=%s.\n",WHERE//iRet= "exception=%s.\n",WHEREiRet=gpBillLog->Warning(WARNING_FATAL,iRet,WHEREFORMAT exception.\n",WHERE);【規(guī)則thrownewdeletee=具體根據(jù)throw時參數(shù)類型是對象本身還是指針。new??的異常對象是堆中構造,需要做相應的delete操作,以正確的釋放內存。snprintf,vsnprintf函數(shù),使用上述函數(shù)時,禁止自拷貝(源和目的地址相同)。strcpy和sprintf函數(shù)不帶緩沖區(qū)長度,存在內存越界風險,改為更加安全的memccpymemccpy函數(shù)則會遇到指定的字符就停止拷貝,并且指定字符也會memccpystrncpy函數(shù)時一樣在緩沖區(qū)末尾snprintflinux下會導致非預期結果,可以4-14】對指定大小的數(shù)組(包括堆中分配的和棧中分配的)UR: 正確的使用方式如下, for(inti=0;i<MAX_DMT_PASER_NUM;m_vDiameterParser[i].iPno=-1;m_vDiameterParser[i].pDiameterTrans=NULL;一般地,對于數(shù)據(jù)庫表數(shù)值類型主鍵,流水表定義為number(12),其他配置表為number(9)或number(6)number(9)longlongnumber(9)及以下的,如果對空間占用要求嚴格,變量可以定義為int類型?!疽?guī)則4-16】程序實現(xiàn)應盡量避免采用遞歸的形式。極個別情況一定要用到遞歸時,實現(xiàn)的算法和代碼應經(jīng)過TA的審核。程序的遞歸是通過調用棧實現(xiàn)的,當遞歸的次數(shù)過多時,會產生棧溢??,導致程序core。遞歸【規(guī)則4-17】保護程序免遭非法輸入數(shù)據(jù)的破壞:需要檢查所有來源于外部數(shù)據(jù)的值和子程序所有輸入?yún)?》中提到,防御式編程的主要思想是:子程序應該不被傳入錯誤的數(shù)據(jù)而被破壞,接受范圍內,字符串是不是合乎用途,包括企圖令緩沖溢??的數(shù)據(jù)、注入的SQL命令、注入的HTML或XML代碼等等。故障單939670,后臺程序收到了一個CCR,在解析和拷貝到自定義的結構體中時未做【規(guī)則1if/elseelse分支沒邏輯也需要把邏輯用注釋寫上。參考620982。地方也可能使用這個查詢方法無意中修改了緩存,導致??錯,樣例參考988161。0內存越界:charpath[256返回GetAttrNULL:GetAttr()->AsInteger()core231int類型,特別是:錢/使用量/ID/IDSession.ExtAttr可能超長,引起截斷時,需設置返回碼為5031。該字段讀取解析的地方,注意完整性校驗。否則可能導致core。UR:10906021000以上大字符串,復制使用memccpy代替strncpy,初始化、復位使用首字符設置【規(guī)則4-19】創(chuàng)建線程時,需要實際需求確定棧大小,并調用接口指定線程棧大小,避免依賴平臺操作系《C++編程規(guī)范——101條規(guī)則、準則與最佳實踐》中第68條:廣泛地使用斷言記錄內部需要注意,不能用斷言來檢查最終產品肯定會??現(xiàn)且必須處理的錯誤情況。斷言是用來處如某模塊收到其它模塊或鏈路上的消息后,要對消息的合理性進行檢查,此過程為正常的錯誤【建議GOTGOT方式(簡單但存在一些性能問題【建議因為全局變量存放在數(shù)據(jù)段,每次訪問都會有一個從數(shù)據(jù)段讀取的動作,相比而言局部變量有可能在棧中,也有可能在寄存器中,每次都需要先從數(shù)據(jù)段中讀??該變量值,處理完成后在要寫回數(shù)據(jù)段,效率相對較低。需要在循環(huán)中使用上述變量時,可以考慮先將其賦值給一個局部變量.局部變量5-3122如:如:inta[20][20]可以優(yōu)化成int5-4】ifelseifelseif(a==//elseif(a==2////5-6forif語句,CPU流水線的清空和轉移等低效率事件的發(fā)生,可以將if語句提到循環(huán)外面來。水線,等待新的跳轉目的指令的取指執(zhí)行,所以可以將if語句提到循環(huán)外面來。為5-8mmap,將文件映射到內存,可以提高效率,但是需要注意文件太大會影【建議【建議TSChrTSChrsSessionId<<';'<<pRatableEvent.GetAttrEx(EA::RATING_GROUP)->AsInteger()<<';'<<頭文件,這樣編譯包含此頭文件的cpp文件時,會因為依賴減少而縮短了編譯時間。5-12】優(yōu)先調用前置形式的++和--說明:根據(jù)說明:根據(jù)代替,同時注意后續(xù)的字符串拷貝等操作要設置0結束符。符置0的方式,另外strncpy函數(shù)當源字符串比目標字符串短的時候,strncpy會用0來填充不足的部分,導致性能下降,而memccpy函數(shù)則會遇到指定的字符就停止拷貝,不過在使用memccpy時要在緩沖區(qū)末尾增加結束符,避免內存越界訪問。+B??B附錄 CodeReviewCheck規(guī)則2-代碼走查結合排版工具(astyle)規(guī)則2-代碼走查結合排版工具(astyle)規(guī)則2-代碼走查結合排版工具(astyle)規(guī)則2-規(guī)則2-規(guī)則2-規(guī)則2-規(guī)則2-規(guī)則2-規(guī)則2-規(guī)則2-編譯開關規(guī)則2-規(guī)則2-規(guī)則2-規(guī)則2-規(guī)則2-代碼走查結合排版工具(astyle)規(guī)則2-規(guī)則3-規(guī)則3-規(guī)則3-static規(guī)則3-規(guī)則3-規(guī)則3-規(guī)則3-規(guī)則3-規(guī)則3-規(guī)則3-過程/函數(shù)中申請的文件句柄,在退??規(guī)則3-規(guī)則3-規(guī)則3-規(guī)則3-規(guī)則3-編譯選項可以查規(guī)則3-規(guī)則3-規(guī)則3-Clean規(guī)則3-規(guī)則3-const規(guī)則3-char規(guī)則4-規(guī)則4-debug_new規(guī)則4-規(guī)則4-規(guī)則4-規(guī)則4-業(yè)務代碼中是否違規(guī)向外層拋??規(guī)則4-規(guī)則4-構造函數(shù)是否違規(guī)拋??規(guī)則4-析構函數(shù)是否違規(guī)拋??規(guī)則4-operatornewoperator規(guī)則4-規(guī)則4-規(guī)則4-strcpy/sprintf規(guī)則4-規(guī)則4-long規(guī)則4-規(guī)則4-規(guī)則4-4-附錄 usingnamespace(catch(...)(B)classTMemSeq#ifndefQUICK_MEMORY_DATABASE_SEQUANCE_H #define #includeclassTMemSeq#endif// #ifdef #includeclassTMemSeq#endif// #ifndef #includeclassTMemSeq#endif// (B)#include"Helper/mdbConfig.h"#include"unistd.h"#include"Helper/mdbConfig.h"#include<unistd.h>#include<Helper/mdbConfig.h>#include"unistd.h"#include<Helper/mdbConfig.h>#include<unistd.h>(C)Ur:98723以賬期結束時間-1sUR:10101m_pRecurringEvent->SetAttr(EA::EVENT_BEGIN_TIME,m_pBillingCycleInfo->pRecord->dCycleBeginDate);m_pRecurringEvent->SetAttr(EA::EVENT_BEGIN_TIME,m_pBillingCycleInfo->pRecord->dCycleBeginDate);UR:10101m_pRecurringEvent->SetAttr(EA::EVENT_BEGIN_TIME,m_pBillingCycleInfo->pRecord->dCycleBeginDate);Ur:98723以賬期結束時間-1s (D)#define#define#define#define

(C)debugdebug定義符合我們規(guī)范的方式是:#ifndefintiLogLevel=HELP_CONFIG::ReadInteger("COMMON","LOG_LEVEL",3);#ifndefintiLogLevel=HELP_CONFIG::ReadInteger("COMMON","LOG_LEVEL",3);#ifndefintiLogLevel=HELP_CONFIG::ReadInteger("COMMON","LOG_LEVEL",3);#ifndefintiLogLevel=HELP_CONFIG::ReadInteger("COMMON","LOG_LEVEL",3);(D)(B)

protectedprivate(C)

boolExecuteAcctItemImm(llongllSubsId,intiAcctItemTypeCount,llongllBillingCycleId,llongiBatchId,boolexecuteAcctItemImm(llongllSubsId,intiAcctItemTypeCount,llongllBillingCycleId,llongiBatchId,boolAcctItemImmExecute(llongllSubsId,intiAcctItemTypeCount,llongllBillingCycleId,llongiBatchId,boolacctitemimmexecute(llongllSubsId,intiAcctItemTypeCount,llongllBillingCycleId,llongiBatchId,(A)intPartnerId=staticbools_bUseShareMem=voidSetPartnerId(intchar*pUserName=intaiPartnerIds[32]=staticints_iEnterTimes= 10.6aiPartnerIdsaiPartnerIds (D) ② (A)intg_iSubsId=10;voidSetSubsId(intintiSubsID=printf(“%d,%d,%d\n”,g_iSubsId,iSubsId, (C) 縮進2個空 縮進4個空 縮進1個(B)

2public,protected成員函數(shù),需要給??doxygenbrief、param、return、retval的關鍵字必須說明。 某些情況下,privatedoxygen風格的注釋。(B) (D)charif(iRetFlag==0)iRetFlag=ADD_ERROR("SETT-PROC-0011","Renamefilefailure,%s\n",sTime);14-556iRetFlag (D)staticcharsTime[20]={0};121,2(A)constchar*TRecordData::GetNextPath(char*sDataPath) 1constchar*3return1char*sDataPathconstchar(C)boolconstllongTRateLink2llong3TRateLink3TRateLink (D)boolif((year%4==0)&&((year%100!=0)||(year%400bRet= const,1行改為(constint參數(shù)不可做工作變量,4intiYearyear;year(C)(B)(A)這段C++class virtualvoidcout<<"<<Test.TestForCodeRulethis:"<<this<<"vtadr:"<<*(void**)this<< 是,virtualvoidTestForCodeRule()沒有使用return;是,virtualvoidTestForCodeRule()是,Tes

溫馨提示

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

評論

0/150

提交評論