源代碼書寫規(guī)范-軟件編寫規(guī)范_第1頁
源代碼書寫規(guī)范-軟件編寫規(guī)范_第2頁
源代碼書寫規(guī)范-軟件編寫規(guī)范_第3頁
源代碼書寫規(guī)范-軟件編寫規(guī)范_第4頁
源代碼書寫規(guī)范-軟件編寫規(guī)范_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

版本號:TDCQ C/C++源代碼及其文檔書寫規(guī)范TDCQ公司20XX年05月C/C++C/C++源代碼及其文檔書寫規(guī)范--PAGE4-目 錄1前言 .-1-2DNC前綴和名空間1-2.1CDNC做前綴12.2C++DNC13C/C++23.1C/C++源代碼注釋23.1.1總體注釋要求3-3.1.2說明性文件頭部的注釋3-3.1.3源文件頭部的注釋4-3.1.4函數(shù)頭部的注釋5-3.1.5if、while、do等其大括號內(nèi)嵌代碼塊的注釋5-3.1.6某個代碼段的注釋6-3.1.7注釋的位置6-3.1.8對于所有物理含義的變量、常量及宏的注釋7-3.1.9數(shù)據(jù)結(jié)構(gòu)聲明(包括數(shù)組、結(jié)構(gòu)、類、枚舉等)的注釋7-3.1.10全局變量的注釋7-3.1.11注釋與所描述內(nèi)容縮進的要求832C/C++源代碼注釋書寫與幫助文檔的自動生成83.2.1塊注釋8-3.2.2行注釋9-3.2.3函數(shù)的摘要9-3.2.4函數(shù)的形參9-3.2.5函數(shù)的返回值9-3.2.6函數(shù)的注意事項(Remark)10-3.2.7補充說明10-3.3C/C++代碼書寫規(guī)范103.3.1每行代碼長度10-3.3.2合并行的問題 .--3.3.3指針中*號的位置--3.3.4全局函數(shù)的調(diào)用12-3.3.5if...elseif12-3.3.6與“{”、“}”有關(guān)的規(guī)定12-與“{”、“}”有關(guān)代碼的縮進格式12“{”、“}”的省略12-3.3.7與空格有關(guān)的各項規(guī)定13-對兩目、三目運算符兩邊的空格的規(guī)定13-for、while、if等關(guān)鍵字之后空格的規(guī)定13-對調(diào)用函數(shù)、宏時的空格規(guī)定13-對類型強制轉(zhuǎn)換時的空格規(guī)定14-3.3.8代碼縮進/對齊使用空格的規(guī)定14-4個空格14-代碼不縮進情況14-3.3.9與類相關(guān)的.h文件與.cpp文件15-類的定義與實現(xiàn)15-類的合并15-3.3.10對變量的要求15-對變量的要求15-對變量類型的要求16-3.3.11對結(jié)構(gòu)的要求16結(jié)構(gòu)的功能要單一16不同結(jié)構(gòu)間的關(guān)系要簡單173.3.12函數(shù)的編寫要求18-函數(shù)編寫的總體要求18-函數(shù)名的要求19-函數(shù)參數(shù)的要求19-函數(shù)功能的要求20-可重入函數(shù)編寫 .-21-3.3.13C/C++程序效率的要求223.3.14C/C++代碼質(zhì)量的要求23代碼質(zhì)量保證優(yōu)先原則23-對內(nèi)存及句柄操作的要求23-其他要求25-3.3.15C/C++代碼測試與維護264 C/C++274.1總體命名要求27-4.2具體命名規(guī)范28-4.2.1工程名28-4.2.2文件名28-4.2.3函數(shù)名28-4.2.4變量名28-4.2.5類名29-4.2.6結(jié)構(gòu)、宏、枚舉及聯(lián)合的名字29-4.2.7具有互斥意義的變量或相反動作的函數(shù)的命名29-4.2.8對命名中下劃線的使用規(guī)定30-5程序開發(fā)中相關(guān)文檔撰寫規(guī)定30-5.1程序設(shè)計與開發(fā)文檔30-5.1.1軟件的開發(fā)背景30-5.1.2軟件的結(jié)構(gòu)設(shè)計30-5.1.3數(shù)據(jù)及資源文件說明31-數(shù)據(jù)用途31-數(shù)據(jù)格式31-5.1.4程序結(jié)構(gòu)設(shè)計與開發(fā)31-5.2程序使用文檔31-5.2.1軟件系統(tǒng)的程序組成31-5.2.2開發(fā)環(huán)境要求、軟件安裝及環(huán)境配置31-5.2.3軟件系統(tǒng)的使用方法 .-34-5.3程序測試文檔36-5.3.1測試環(huán)境37-5.3.2軟件測試項目和功能37-5.3.3軟件測試數(shù)據(jù)及格式37-5.3.4軟件測試過程37-5.4軟件程序調(diào)試文檔37-6程序及文檔備份39-6.1源程序及其文檔備份39-6.2第三方軟件(開發(fā)包或源碼)及其文檔備份39-7詞語縮寫表397.1詞語縮寫的總體要求39-7.2通用詞縮寫表39-7.3專業(yè)詞縮寫表44-8中心代碼實例46-8.1*.h的編寫實例46-8.2*.CPP的編寫實例49C/C++源代碼及其文檔書寫規(guī)范C/C++源代碼及其文檔書寫規(guī)范--PAGE54-前言C/C++源代碼及其相應(yīng)文檔的書寫規(guī)范。制定本規(guī)范的目的是統(tǒng)一北航數(shù)字導(dǎo)航中心研發(fā)部的C/C++語言源代碼的書寫風(fēng)格、注釋內(nèi)容和相應(yīng)文檔的撰寫,以便于代碼的閱讀、維護、管理、修訂及使用。從制定完成即日起,程序員在編寫C/C++代碼的時候,需要嚴格遵守制定的《C/C++源代碼及其文檔書寫規(guī)范》。此外,利用其他語言(VB、DelphiMatlab等)編寫的程序的程序員同樣要遵守本規(guī)范。DNC前綴和名空間CDNC做前綴C代碼的接口函數(shù)一律使用DNC(DigitalNavigationCenter,數(shù)字導(dǎo)航中心英文縮寫)做前綴。例如//C語言代碼在函數(shù)前加DNC_前綴即可,例intDNC_FunName();{return0;}C++DNC做名空間C++代碼使用DNC做名空間。具體示例如下//*.h文件namespaceDNC{classCDncDemo{public:CDncDemo();~CDncDemo();};}//*.cpp文件namespaceDNC{CDncDemo::CDncDemo(){}CDncDemo::~CDncDemo(){}}//在使用CDncDemo的文件中加入:usingnamespaceDNC;//然后定義對象CDncDemodncobj;//或者直接DNC::CDncDemodncobj;C/C++源代碼注釋及書寫規(guī)范C/C++源代碼注釋除非極其簡單,否則對函數(shù)應(yīng)有注釋說明。內(nèi)容包括:功能、入口/出口參數(shù),必要時還可有備注或補充說明。推薦采取特定的格式(見第3.2條),以方便用軟件自動生成幫助文檔??傮w注釋要求20%以上;也不能太少,注釋語言必須準確、易懂、簡潔;反而有害;除非必要,不應(yīng)在代碼或表達中間插入注釋,否則容易使代碼可理解性變差;進行必要的說明;注釋格式盡量統(tǒng)一,建議使用“/**/;建議多使用中文,除非能用非常流利準確的英文表達。說明性文件頭部的注釋(如頭文件.h.c/c++.def.cfg等與其它文件的關(guān)系、修改日志等,頭文件的注釋中還應(yīng)有函數(shù)功能簡要說明。示例:下面這段頭文件的頭注釋比較標準,當(dāng)然,并不局限于此格式,但上述信息建議要包含在內(nèi)。/*************************************************Copyright(C),2008-2022,DNCBUAAFilename: //文件名Author: Version: Date: //作者、版本及完成日期Description: //用于詳細說明此程序文件完成的主要功能,與其他模塊//或函數(shù)的接口,輸出值、取值范圍、含義及參數(shù)間的控//制、順序、獨立或依賴等關(guān)系Others: //其它內(nèi)容的說明FunctionList://主要函數(shù)列表,每條記錄應(yīng)包括函數(shù)名及功能簡要說明1.History: //修改歷史記錄列表,每條修改記錄應(yīng)包括修改日期、修改//者及修改內(nèi)容簡述1.Date:Author:Modification:2.*************************************************/源文件頭部的注釋源文件頭部應(yīng)進行注釋,列出:版權(quán)說明、版本號、生成日期、作者、模塊目的/功能、主要函數(shù)及其功能、修改日志等。示例:下面這段源文件的頭注釋比較標準,當(dāng)然,并不局限于此格式,但上述信息建議要包含在內(nèi)。/********************************************************Copyright(C),2008-2022,DNCBUAAFileName:test.cppAuthor: Version Date://作者、版本及完成日期Description: //模塊描述Version: //版本信息FunctionList: //主要函數(shù)及其功能1. History: //歷史修改記錄David 96/10/12 1.0 buildthismoudle*********************************************************/說明:Description一項描述本文件的內(nèi)容、功能、內(nèi)部各部分之間的關(guān)系及本文件與History者及修改內(nèi)容簡述。函數(shù)頭部的注釋函數(shù)頭部應(yīng)進行注釋,列出:函數(shù)的目的/功能、輸入?yún)?shù)、輸出參數(shù)、返回值、調(diào)用關(guān)系(函數(shù)、表)等。示例:下面這段函數(shù)的注釋比較標準,當(dāng)然,并不局限于此格式,但上述信息建議要包含在內(nèi)。/*************************************************Function: //函數(shù)名稱Description: //函數(shù)功能、性能等的描述Calls: //被本函數(shù)調(diào)用的函數(shù)清單CalledBy: //調(diào)用本函數(shù)的函數(shù)清單TableAccessed://被訪問的表(此項僅對于牽扯到數(shù)據(jù)庫操作的程序)TableUpdated://被修改的表(此項僅對于牽扯到數(shù)據(jù)庫操作的程序)Input://輸入?yún)?shù)說明,包括每個參數(shù)的作//用、取值說明及參數(shù)間關(guān)系。Output://對輸出參數(shù)的說明。Return://函數(shù)返回值的說明Others://其它說明*************************************************/if、while、do等其大括號內(nèi)嵌代碼塊的注釋比較長(需拖動滾動條來看)或者多層嵌套時,在結(jié)尾的“}”后要加上其所對應(yīng)的語句的注釋說明。例1:if(...){//programcodewhile(index<MAX_INDEX){//programcode/*endofwhile(index<MAX_INDEX)*///指明該條while語句結(jié)束/*endofif(...)*///指明是哪條if例2:BOOLDNC_SaveToFile(constcharBOOLbCanReplace/*=TRUE*/);某個代碼段的注釋描述某個代碼段的注釋,可以給注釋描述的代碼段外圍加上{},幫助閱讀。例://代碼段實現(xiàn)功能或意圖描述{代碼段}注釋的位置注釋應(yīng)與其描述的代碼相近,對代碼的注釋應(yīng)放在其上方或右方相鄰位置,不可放在下面,如放于上方則需與其上面的代碼用空行隔開。示例:如下例子不符合規(guī)范。例1:/*getreplicatesubsystemindexandnetindicator*/repssn_ind=ssn_data[index].repssn_index;repssn_ni=ssn_data[index].ni;例2:repssn_ind=ssn_data[index].repssn_index;repssn_ni=ssn_data[index].ni;/*getreplicatesubsystemindexandnetindicator*/應(yīng)如下書寫/*getreplicatesubsystemindexandnetindicator*/repssn_ind=ssn_data[index].repssn_index;repssn_ni=ssn_data[index].ni;對于所有物理含義的變量、常量及宏的注釋對于所有物理含義的變量、常量,如果其命名不是充分自注釋的,在聲明時都必/*activestatistictasknumber*/#defineMAX_ACT_TASK_NUMBER1000#defineMAX_ACT_TASK_NUMBER1000/*activestatistictasknumber*/數(shù)據(jù)結(jié)構(gòu)聲明(包括數(shù)組、結(jié)構(gòu)、類、枚舉等)的注釋數(shù)據(jù)結(jié)構(gòu)聲明(包括數(shù)組、結(jié)構(gòu)、類、枚舉等),如果其命名不是充分自注釋的,必須加以注釋。對數(shù)據(jù)結(jié)構(gòu)的注釋應(yīng)放在其上方相鄰位置,不可放在下面;對結(jié)構(gòu)中的每個域的注釋放在此域的右方。示例:可按如下形式說明枚舉/數(shù)據(jù)/聯(lián)合結(jié)構(gòu)。/*sccpinterfacewithsccpuserprimitivemessagename*/enumDNC_USER_PRIMITIVE{N_UNITDATA_IND;/*dncnotifydncuserunitdatacome*/N_NOTICE_IND;/*dncnotifyusertheNo.7networkcannot*//*transmissionthismessage*/N_UNITDATA_REQ;/*dncuser'sunitdatatransmissionrequest*/};全局變量的注釋全局變量要有較詳細的注釋,包括對其功能、取值范圍、哪些函數(shù)或過程存取它以及存取時注意事項等的說明。示例:/*TheErrorCodewhenDNCtranslate*//*GlobalTitlefailure,asfollows*///變量作用、含義/*0-SUCCESS1-GTTableerror*//*2-GTerrorOthers-nouse*///變量取值范圍/*onlyfunctionDNC_Translate()in*//*thismodualcanmodifyit,andother*//*modulecanvisititthroughcall*//*thefunctionDNC_GetGTTransErrorCode()*///使用方法BYTEg_GTTranErrorCode;注釋與所描述內(nèi)容縮進的要求注釋與所描述內(nèi)容進行同樣的縮排,做到程序排版整齊,并方便注釋的閱讀與理解。例如voidDNC_ExampleFun(void){/*codeonecommentsCodeBlockOne/*codetwocommentsCodeBlockTwo}3.2C/C++源代碼注釋書寫與幫助文檔的自動生成C/C++Doxygen工具自動生成幫助文3.1節(jié)。塊注釋[格式]開頭:/**結(jié)尾:*/例:/***...Thisisablockcomment...*/行注釋[格式]開頭:///例:///Thisisalinecomment...函數(shù)的摘要[格式]在函數(shù)聲明主體開頭的注釋塊中加上控制符:@brief例:/***@brief用于從輸入流讀取一個字符,不回顯*/intgetch(void);函數(shù)的形參[格式]在函數(shù)聲明主體開頭的注釋塊中加上控制符:@param例:/**@parambuf1緩沖區(qū)1@parambuf2緩沖區(qū)2@paramcount字符的個數(shù)*/intmemcmp(constvoid*buf1,constvoid*buf2,size_tcount);函數(shù)的返回值[格式]在函數(shù)聲明主體開頭的注釋塊中加上控制符:@return例1:/***@return讀取的字符*/intgetchar(void);例2:/***@returnNone*/voidrewind(FILE*stream);函數(shù)的注意事項(Remark)[格式]在函數(shù)聲明主體開頭的注釋塊中加上控制符:@remark例:/***@remark拷貝strSource到strDestination(包含strSource中的'\0'),要注意在拷貝的過程中并沒有溢出檢查*/char*strcpy(char*strDestination,constchar*strSource);補充說明Doxygen幾項功能也可以滿足需求了。C/C++代碼書寫規(guī)范每行代碼長度80ASCII例:HANDLEDNC_OpenFile(constcharcszFileName[],intnMode);或者:BOOLDNC_ReadFile(HANDLEhFile,void*pvBuffer,intnReadSize,int*pnReadSize);合并行的問題循環(huán)、分支代碼,判斷條件與執(zhí)行代碼不得在同一行上。例:正確:if(n==-2)n=1;elsen=2;不得寫做:If(n==-2)n=1;elsen=2;指針中*號的位置指針的定義,*號既可以緊接類型,也可以在變量名之前。例:可寫做:int*pnsize; //統(tǒng)一使用這種格式也可寫做:int*pnsize;但不得寫做:int*pnsize;全局函數(shù)的調(diào)用在類的成員函數(shù)內(nèi)調(diào)用全局函數(shù)時,在全局函數(shù)名前必須加上“::”。if...elseifelseif必須寫在一行。與“{”、“}”有關(guān)的規(guī)定與“{”、“}”有關(guān)代碼的縮進格式在“{”Tab之外的其他任何字符;在它之后可有注釋,但不允許有代碼。與“{”對應(yīng)的“}”必須在同一列上。例:正確:for(i=0;i<cbLine;i++){//printf("Line%d:",i);printf("%s\n",pFileLines[i]);}不得寫做:for(i=0;i<cb;i++){printf("Line%d:",i);printf("%s\n",pFileLines[i]);}也不得寫做:for(i=0;i<cb;i++){printf("Line%d:",i);printf("%s\n",pFileLines[i]);}“{”、“}”的省略在循環(huán)、分支之后若只有一行代碼,在無歧義的情況下可省略“{”、“}”。例:if(n==-2)n=1;elsen=2;與空格有關(guān)的各項規(guī)定對兩目、三目運算符兩邊的空格的規(guī)定在所有兩目、三目運算符的兩邊都必須有空格。在單目運算符兩端不必空格。但在“->”、“::”、“.”、“[”、“]”等運算符前后,及“&”(取地址)、“*”(取值)等運算符之后不得有空格。例:正確:intn=0,nTemp;for(inti=nMinLine;i<=nMaxLine;i++)不得寫做:intn=0,nTemp;for(inti=nMinLine;i<=nMaxLine;i++)對for、while、if等關(guān)鍵字之后空格的規(guī)定for、while、if1個空格,再接“(”例:正確:if(-2==n)不得寫做:if(-2==n)對調(diào)用函數(shù)、宏時的空格規(guī)定調(diào)用函數(shù)、宏時,“(”前不得有空格。例:正確:printf("%d\n",nIndex);不得寫做:printf("%d\n",nIndex);對類型強制轉(zhuǎn)換時的空格規(guī)定類型強制轉(zhuǎn)換時,“(”“)”前后不得有空格例:可寫做:(DNC_File*)pFile;也可寫做:(DNC_File*)pFile不得寫做:(DNC_File*)pFile(DNC_File*)pFile代碼縮進/對齊使用空格的規(guī)定布局不整齊,BCBC8個空格變?yōu)橐粋€BC合入的版本大多會將縮進變亂。4個空格函數(shù)體相對函數(shù)名及“{”、“}”例:intpower(intx){return(x*x);}if、else、for、while、do等之后的代碼*/算符,則運算符應(yīng)在上一行末尾,而不應(yīng)在下一行的行首。代碼不縮進情況switchcase、defaul代碼不縮進。例:switch(nID){caseID_PLAY:break;caseID_STOP:break;default:break;}與類相關(guān)的.h文件與.cpp文件類的定義與實現(xiàn)原則上,應(yīng)該在一個單獨的.h文件中定義一個類,在一個單獨的.cpp文件中實現(xiàn)這個類。.h與.cpp文件的文件名必須與類名相同。類的合并若幾個類的規(guī)模都不大,關(guān)系又很密切,則可在一個.h文件中定義這些類,在一個.cpp文件中實現(xiàn)。對于附屬于較大規(guī)模類的一個很小規(guī)模的類,可以寫在那個大規(guī)模類的.h和.cpp里。對變量的要求對變量的要求塊間的耦合度;必要還應(yīng)說明與其它變量的關(guān)系;性;防止局部變量與公共變量同名;共變量,防止多個不同模塊或函數(shù)都可以修改、創(chuàng)建同一公共變量的現(xiàn)象;嚴禁使用未經(jīng)初始化的變量作為右值;境關(guān)系密切的變量;調(diào)以及代碼維護等。這種關(guān)系的說明可在注釋或文檔中描述。示例:在源文件中,可按如下注釋形式說明。RELATIONSystem_InitInput_RecPrint_RecStat_ScoreStudentCreateModifyAccessAccessScoreCreateModifyAccessAccess,Modify注:RELATION為操作關(guān)系;System_Init、Input_Rec、Print_Rec、Stat_Score為四個不同的函數(shù);Student、Score為兩個全局變量;Create表示創(chuàng)建,Modify表示修改,AccessInput_Rec、Stat_ScoreScore,故此變量將引起函數(shù)間較大的耦合,并可能增加代碼測試、維護的難度。對變量類型的要求Cstatic局部變量將在內(nèi)存“數(shù)據(jù)區(qū)”static局部變量將在“堆棧”中生成。這些細節(jié)對程序質(zhì)量的保證非常重要;患;盡量減少沒有必要的數(shù)據(jù)類型默認轉(zhuǎn)換與強制轉(zhuǎn)換;合理地設(shè)計數(shù)據(jù)并使用自定義數(shù)據(jù)類型,避免數(shù)據(jù)間進行不必要的類型轉(zhuǎn)換;對編譯系統(tǒng)默認的數(shù)據(jù)類型轉(zhuǎn)換,也要有充分的認識。對結(jié)構(gòu)的要求結(jié)構(gòu)的功能要單一設(shè)計結(jié)構(gòu)時應(yīng)力爭使結(jié)構(gòu)代表一種現(xiàn)實事務(wù)的抽象,而不是同時代表多種。結(jié)構(gòu)中的各元素應(yīng)代表同一事務(wù)的不同側(cè)面,而不應(yīng)把描述沒有關(guān)系或關(guān)系很弱的不同事務(wù)的元素放到同一結(jié)構(gòu)中。示例:如下結(jié)構(gòu)不太清晰、合理。typedefstructSTUDENT_STRU{unsignedcharname[8];/*student'sname*/unsignedcharage;/*student'sage*/unsignedcharsex;/*student'ssex,asfollows*//*0-FEMALE;1-MALE*/unsignedcharteacher_name[8];/*thestudentteacher'sname*/unisgnedcharteacher_sex;/*histeachersex*/}STUDENT;若改為如下,可能更合理些。typedefstructTEACHER_STRU{unsignedcharname[8];/*teachername*/unisgnedcharsex;/*teachersex,asfollows*//*0-FEMALE;1-MALE*/}TEACHER;typedefstructSTUDENT_STRU{unsignedcharname[8];/*student'sname*/unsignedcharage;/*student'sage*/unsignedcharsex;/*student'ssex,asfollows*//*0-FEMALE;1-MALE*/unsignedintteacher_ind;/*histeacherindex*/}STUDENT;不同結(jié)構(gòu)間的關(guān)系要簡單若兩個結(jié)構(gòu)間關(guān)系較復(fù)雜、密切,那么應(yīng)合為一個結(jié)構(gòu)。示例:如下兩個結(jié)構(gòu)的構(gòu)造不合理。typedefstructPERSON_ONE_STRU{unsignedcharname[8];unsignedcharaddr[40];unsignedcharsex;unsignedcharcity[15];}PERSON_ONE;typedefstructPERSON_TWO_STRU{unsignedcharname[8];unsignedcharage;unsignedchartel;}PERSON_TWO;由于兩個結(jié)構(gòu)都是描述同一事物的,那么不如合成一個結(jié)構(gòu)。typedefstructPERSON_STRU{unsignedcharname[8];unsignedcharage;unsignedcharsex;unsignedcharaddr[40];unsignedcharcity[15];unsignedchartel;}PERSON;函數(shù)的編寫要求函數(shù)編寫的總體要求明確函數(shù)功能,精確(而不是近似)地實現(xiàn)函數(shù)設(shè)計;200行以內(nèi)(不包括注釋和空格行);函數(shù)的返回值要清楚、明了,讓使用者不容易忽視錯誤情況;方式或強制的轉(zhuǎn)換方式作為返回值返回;有必要的默認數(shù)據(jù)類型轉(zhuǎn)換或強制數(shù)據(jù)類型轉(zhuǎn)換。函數(shù)名的要求函數(shù)名應(yīng)準確描述函數(shù)的功能。processhandle名,因為這些動詞并沒有說明要具體做什么。OOP(名詞是對象本身)。示例:參照如下方式命名函數(shù)。voidDNC_PrintRecord(unsignedintrec_ind);intDNC_InputRecord(void);unsignedcharDNC_GetCurrentColor(void);函數(shù)參數(shù)的要求在同一項目組應(yīng)明確規(guī)定對接口函數(shù)參數(shù)的合法性檢查應(yīng)由函數(shù)的調(diào)用者負防止將函數(shù)的參數(shù)作為工作變量。將函數(shù)的參數(shù)作為工作變量,有可能錯誤最后再將該局部變量的內(nèi)容賦給該參數(shù)。示例:下函數(shù)的實現(xiàn)不太好。voidDNC_SumData(unsignedintnum,int*data,int*sum){unsignedintcount;*sum=0;for(count=0;count<num;count++){*sum+=data[count];//sum成了工作變量,不太好。}}若改為如下,則更好些。voidDNC_SumData(unsignedintnum,int*data,int*sum){unsignedintcount;intsum_temp;sum_temp=0;for(count=0;count<num;count++){sum_temp+=data[count];}*sum=sum_temp;}函數(shù)功能的要求一個函數(shù)僅完成一件功能。為簡單功能編寫函數(shù)。雖然為僅用一兩行就可完成的功能去編函數(shù)好像沒有必要,但用函數(shù)可使功能明確化,增加程序可讀性,亦可方便維護、測試。示例:如下語句的功能不很明顯。value=(a>b)?a:b;改為如下就很清晰了。intmax(inta,intb){return((a>b)?a:b);}value=max(a,b);解、測試、維護等變得困難。函數(shù)的功能應(yīng)該是可以預(yù)測的,也就是只要輸入數(shù)據(jù)相同就應(yīng)產(chǎn)生同樣的輸出??芍厝牒瘮?shù)編寫(C/C++auto即缺省態(tài)局部變量或寄存器變量+語言的可重入static可重入性。編寫可重入函數(shù)時,若使用全局變量,則應(yīng)通過關(guān)中斷、信號量(P、V作可知狀態(tài)。ExamintSqure_ExamExam平方值。那么如下函數(shù)不具有可重入性。unsignedintexample(intpara){unsignedinttemp;Exam=para;//(**)temp=Square_Exam(returntemp;}此函數(shù)若被多個進程調(diào)用的話,其結(jié)果可能是未知的,因為當(dāng)(**)語句剛執(zhí)行完后,另外一個使用本函數(shù)的進程可能正好被激活,那么當(dāng)新激活的進程執(zhí)行到此函數(shù)時,將使Exam賦與另一個不同的para值,所以當(dāng)控制重新回到“temp=Square_Exam()”后,計算出的temp很可能不是預(yù)想中的結(jié)果。此函數(shù)應(yīng)如下改進。unsignedintexample(intpara){unsignedinttemp;[申請信號量操作]//若申請不到“信號量”,說明另外的進程正處于Exampara;//Exam賦值并計算其平方過程中(即正在使用此tempSquare_Exam//信號),本進程必須等待其釋放信號后,才可繼[釋放信號量操作]//續(xù)執(zhí)行。若申請到信號,則可繼續(xù)執(zhí)行,但其//號。returntemp;}C/C++程序效率的要求編程時要經(jīng)常注意代碼的效率。代碼效率分為全局效率、局部效率、時間效率及空間效率局部效率應(yīng)為全局效率服務(wù),不能因為提高局部效率而對全局效率造成影響。效率。這種方式是解決軟件空間效率的根本辦法。仔細分析有關(guān)算法,并進行優(yōu)化。(提高程序效率。避免循環(huán)體內(nèi)含判斷語句,應(yīng)將循環(huán)語句置于判斷語句的代碼塊之中。盡量用乘法或其它方法代替除法,特別是浮點運算中的除法。不要一味追求緊湊的代碼。說明:因為緊湊的代碼并不代表高效的機器碼。C/C++代碼質(zhì)量的要求代碼質(zhì)量保證優(yōu)先原則正確性,指程序要實現(xiàn)設(shè)計要求的功能。穩(wěn)定性、安全性,指程序穩(wěn)定、可靠、安全。可測試性,指程序要具有良好的可測試性。規(guī)范/可讀性,指程序書寫風(fēng)格、命名規(guī)則等要符合規(guī)范。全局效率,指軟件系統(tǒng)的整體效率。局部效率,指某個模塊/子模塊/函數(shù)的本身效率。個人表達方式/個人方便性,指個人編程習(xí)慣。對內(nèi)存及句柄操作的要求只引用屬于自己的存貯空間。若模塊封裝的較好,那么一般不會發(fā)生非法引用他人的空間。防止引用已經(jīng)釋放的內(nèi)存空間。在實際編程過程中,稍不留心就會出現(xiàn)在一(C語言指針過程/函數(shù)中分配的內(nèi)存,在過程/函數(shù)退出之前要釋放。過程/函數(shù)中申請的(為打開文件而使用的)文件句柄,在過程/函數(shù)退出之前注意就有可能發(fā)生。這類錯誤往往會引起很嚴重后果,且難以定位。示例:下函數(shù)在退出之前,沒有把分配的內(nèi)存釋放。typedefunsignedcharBYTE;intDNC_ExampleFun(BYTEgt_len,BYTE*gt_code){BYTE*gt_buf;gt_buf=(BYTE*)malloc(MAX_GT_LENGTH);//programcode,includecheckgt_bufifornotNULL./*globaltitlelengtherror*/if(gt_len>MAX_GT_LENGTH){returnGT_LENGTH_ERROR//gt_buf}//otherprogramcode}應(yīng)改為如下。intDNC_ExampleFun(BYTEgt_len,BYTE*gt_code){BYTE*gt_buf;gt_buf=(BYTE*)malloc(MAX_GT_LENGTH);//programcode,includecheckgt_bufifornotNULL./*globaltitlelengtherror*/if(gt_len>MAX_GT_LENGTH){free(gt_buf//gt_bufreturnGT_LENGTH_ERROR;}//otherprogramcode}些操作時一定要仔細小心。101-10程序存在問題。#defineMAX_USR_NUM10unsignedcharusr_login_flg[MAX_USR_NUM]="";voidDNC_SetUsrLoginFlg(unsignedcharusr_no){if(!usr_login_flg[usr_no]){usr_login_flg[usr_no]=TRUE;}}當(dāng)usr_no為10時,將使用usr_login_flg越界。可采用如下方式解決。voidDNC_SetUsrLoginFlg(unsignedcharusr_no){if(!usr_login_flg[usr_no-1]){usr_login_flg[usr_no-1]=TRUE;}}其他要求容易使系統(tǒng)進入混亂狀態(tài)和不可知狀態(tài)。嚴禁隨意更改其它模塊或系統(tǒng)的有關(guān)設(shè)置和配置。編程時,不能隨心所欲地更改不屬于自己模塊的有關(guān)設(shè)置如常量、數(shù)組的大小等。不能隨意改變與其它模塊的接口。充分了解系統(tǒng)的接口之后,再使用系統(tǒng)提供的功能。1“<=”誤寫成“<”或“>=”成“>”等造成的,由此引起的后果,很多情況下是很嚴重的,所以編程時,一定要在這些地方小心。當(dāng)編完程序后,應(yīng)對這些操作符進行徹底檢查。C/C++中的“=”與“==”“|”與“||”、“&”與“&&”等,若拼寫錯了,編譯器不一定能夠檢查出來。有可能的話,ifelseelse分支的語句要小心對待;switch語句必須有default分支。gotogoto語句會破壞程序的結(jié)構(gòu)性,所以除非確實需要,最goto語句。件的可移植性和可重用性。除非為了滿足特殊需求,避免使用嵌入式匯編。程序中嵌入式匯編,一般都對可移植性有較大的影響。精心地構(gòu)造、劃分子模塊,并按“接口”部分及“內(nèi)核”部分合理地組織子模塊,以提高“內(nèi)核”是對以后產(chǎn)品的升級都會有很大幫助。精心構(gòu)造算法,并對其性能、效率進行測試。對較關(guān)鍵的算法最好使用其它算法來確認。時刻注意表達式是否會上溢、下溢。使用變量時要注意其邊界值的情況。(否超出系統(tǒng)有關(guān)限制。系統(tǒng)出錯情況。(如用戶誤操作等補救。(據(jù)、硬件等的安全構(gòu)成危害,以提高系統(tǒng)的安全性。充分了除非必要,不要使用不熟悉的第三方工具包與控件。使用工具包與控件,可(多語言版本支持DLL獨的描述文件(如數(shù)據(jù)庫格式)C/C++代碼測試與維護單元測試要求至少達到語句覆蓋。單元測試開始要跟蹤每一條語句,并觀察數(shù)據(jù)流及變量的變化。清理、整理或優(yōu)化后的代碼要經(jīng)過審查及測試。代碼版本升級要經(jīng)過嚴格測試。使用工具軟件對代碼版本進行維護。正式版本上軟件的任何修改都應(yīng)有詳細的文檔記錄。發(fā)現(xiàn)錯誤立即修改,并且要記錄下來。關(guān)鍵的代碼在匯編級跟蹤。的效率。盡可能模擬出程序的各種出錯情況,對出錯處理代碼進行充分的測試。仔細測試代碼處理數(shù)據(jù)、變量的邊界情況。保留測試信息,以便分析、總結(jié)經(jīng)驗及進行更充分的測試。不應(yīng)通過“試”來解決問題,應(yīng)尋找問題的根本原因。對自動消失的錯誤進行分析,搞清楚錯誤是如何消失的。修改錯誤不僅要治表,更要治本。測試時應(yīng)設(shè)法使很少發(fā)生的事件經(jīng)常發(fā)生。明確模塊或函數(shù)處理哪些事件,并使它們經(jīng)常發(fā)生。問題。(的“內(nèi)部寄存器”等),讓函數(shù)運行的結(jié)果可預(yù)測,并使出現(xiàn)的錯誤可再現(xiàn)。C/C++源代碼程序命名規(guī)范本規(guī)范給出了工程、文件、函數(shù)、變量、類/結(jié)構(gòu)、宏、常量、枚舉、聯(lián)合等的命名規(guī)范。總體命名要求該名字描述的是中文特有的內(nèi)容,如半角、全角,聲母、韻母等。所有命名都應(yīng)遵循達意原則,即名稱應(yīng)含義清晰、明確。所有命名都不易過長,應(yīng)控制在規(guī)定的最大長度以內(nèi)。所有命名都應(yīng)盡量使用全稱。如果命名使用縮寫,則應(yīng)該使用《通用縮寫表》(見最后一節(jié))中的縮寫;原則說明。具體命名規(guī)范工程名工程名不強制統(tǒng)一。文件名只能由英文字母、數(shù)字和下劃線組成文件名。區(qū)分大小寫,基于跨平臺的考慮,建議全小寫。30個字符。如果文件用于定義或?qū)崿F(xiàn)類,則文件名應(yīng)與類名必須保持一致。函數(shù)名WindowsAPI的命名規(guī)范。64個字符。推薦使用動賓結(jié)構(gòu)。函數(shù)名應(yīng)清晰反映函數(shù)的功能、用途。推薦函數(shù)名第一個字母大寫。變量名+類型+32個英文字符。格式:[m_|s_|g_]type[classname|structname]variablename解釋:·m_:類的成員變量·ms_:類的靜態(tài)成員變量·s_:靜態(tài)全局變量·g_:普通全局變量類型縮寫(type)·char,TCHAR:c/chs/sz/str·bool,BOOL:b·int,int16,int32,int64:n·unsigned:u·long:l·unsignedlong:ul·double,float:f·BYTE:by·WORD:w·DWORD:dw·function:fn·pointer:p小范圍局部變量與結(jié)構(gòu)成員可省略類型縮寫。類名必須以大寫"C"開頭,后面字母反映具體含義,以清晰表達類的用途和功能為原則。接口必須以大寫"I"Interface。當(dāng)名稱由多個單詞構(gòu)成時,每一個單詞的第一個字母必須大寫。結(jié)構(gòu)、宏、枚舉及聯(lián)合的名字結(jié)構(gòu)、宏、枚舉以及聯(lián)合的名字必須全部大寫。具有互斥意義的變量或相反動作的函數(shù)的命名一些在軟件中常用的反義詞組。add/remove begin/end create/destroyinsert/delete first/last get/releaseincrement/decrementput/getadd/deletelock/unlockopen/closemin/maxold/newstart/stopnext/previoussource/targetshow/hidesend/receivecut/pastesource/destination示例:up/downintmin_sum;intmax_sum;intadd_user(BYTE*user_name);intdelete_user(BYTE*user_name);對命名中下劃線的使用規(guī)定除了編譯開關(guān)/頭文件等特殊應(yīng)用,應(yīng)避免使用_EXAMPLE_TEST_之類以下劃線開始和結(jié)尾的定義。程序開發(fā)中相關(guān)文檔撰寫規(guī)定程序開發(fā)中相關(guān)文檔的撰寫是對程序設(shè)計、使用、測試和問題記錄的一個總結(jié),是他人熟悉、掌握和運用(使用、升級和修改)程序的基礎(chǔ),也是一個程序軟件的生命力所在之處。程序設(shè)計與開發(fā)文檔程序設(shè)計與開發(fā)文檔是整個軟件系統(tǒng)的總體構(gòu)成和開發(fā)的內(nèi)容,應(yīng)體現(xiàn)系統(tǒng)的完整性和易讀性。軟件的開發(fā)背景簡要介紹軟件程序的開發(fā)背景及其要實現(xiàn)的功能,并給出文檔中出現(xiàn)的符號的詳細說明。軟件的結(jié)構(gòu)設(shè)計軟件的結(jié)構(gòu)設(shè)計主要體現(xiàn)整個系統(tǒng)軟件的總體架構(gòu),按功能模塊進行劃分,給出每個模塊的功能及模塊間交換的數(shù)據(jù)項,并附圖加以說明。在此基礎(chǔ)之上給出整個軟件的流程圖。數(shù)據(jù)及資源文件說明數(shù)據(jù)用途本節(jié)中給出所編寫運行時需要的數(shù)據(jù)文件和資源文件的格式及來源。數(shù)據(jù)文件的后綴格式(如*.dat,*.txt等等)和數(shù)據(jù)文件的用途,可通過列表給出。數(shù)據(jù)格式(或行)元素所代表的內(nèi)容及量綱。程序結(jié)構(gòu)設(shè)計與開發(fā)功能,并對類中重要的函數(shù)和變量進行說明,并給出每個模塊的具體流程圖。程序使用文檔程序使用文檔是保證軟件程序在不同的機器上運行或者是非開發(fā)人員運行軟件程序的基礎(chǔ),是軟件程序的使用手冊,應(yīng)盡量詳細。軟件系統(tǒng)的程序組成詳細給出所開發(fā)軟件的程序組成及功能,可列表給出。要求將程序文件夾中的每一個文件都要列出,并給出相應(yīng)的功能。在此基礎(chǔ)上給出各個程序間的調(diào)用關(guān)系和配置關(guān)系,即如何操作才能使軟件程序正常運行。開發(fā)環(huán)境要求、軟件安裝及環(huán)境配置WindowsXPVC++6.0OpenCV對于軟件開發(fā)中使用的開發(fā)包的情況,要說明使用的版本號、獲取方法和安裝方式等。另外,還要說明該開發(fā)包有沒有替代品。軟件運行最低配置要求運行環(huán)境:中文WindowsNT操作系統(tǒng)CPU:2.0GHz以上內(nèi)存要求:1G內(nèi)存以上顯示卡最小設(shè)置:16色顯示器:17寸以上彩顯數(shù)據(jù)接口:鍵盤鼠標輸入,文件輸入輸出,顯示器輸出VC++6.0應(yīng)用軟件的安裝及配置VC++6.0應(yīng)用軟件的安裝及配置過程(略。OpenCV的安裝及配置Stept1OpenCV安裝程序OpenCVC:\Program(OpenCV1.0rc1OpenCV1.0在安裝時選擇"將\OpenCV\bin入系統(tǒng)變量"(Add\OpenCV\bintothesystermPATH),1所示。Stept2Windows環(huán)境變量C:\ProgramFiles\OpenCV\bin2Windows(或重啟后重新登陸才生效。(explorer.exe)Stept3VisualC++6.0環(huán)境的全局配置VisualC++6.0Tools->Options->DirectorieslibLibraryfiles3(a)所示。C:\ProgramFiles\OpenCV\lib然后選擇includefiles,在下方填入路徑:C:\ProgramFiles\OpenCV\cxcore\includeC:\ProgramFiles\OpenCV\cv\includeC:\ProgramFiles\OpenCV\cvaux\includeC:\ProgramFiles\OpenCV\ml\includeC:\ProgramFiles\OpenCV\otherlibs\highguiC:\ProgramFiles\OpenCV\otherlibs\cvcam\includeStept4:對VisualC++6.0環(huán)境的項目配置OpenCVVCProject給出如何獲取libSettingfor選為All2OpenCV環(huán)境變量的設(shè)置linkObject/librarymodulescxcore.libcv.libml.libcvaux.libhighgui.libcvcam.lib如果你不需要這么多l(xiāng)ib,你可以只添加你需要的lib,如圖3(b)所示。Stept5DirectXSDK及其配置DirectXSDK及其配置過程(略。(a) (b)圖3VC++6.0全局和項目環(huán)境設(shè)置軟件系統(tǒng)的使用方法根據(jù)所開發(fā)的軟件系統(tǒng)的功能給出具體操作的過程,所有的功能都需要給出操作的過程,從數(shù)據(jù)輸入到結(jié)果輸出。以實驗室開發(fā)的四組合導(dǎo)航仿真軟件的數(shù)據(jù)加載及其顯示為例給出軟件具體操作方法。在菜單中選擇“數(shù)字地圖(M)”今“地圖生成(G)”今“真實地圖(R)…”5或者點擊工具欄的“”。彈出加載真實地圖對話框,選擇地圖文件和地形紋理文件,如圖6所示。加載了真實地圖后,數(shù)據(jù)顯示區(qū)域會顯示當(dāng)前狀態(tài)及加載的地形數(shù)據(jù)的參數(shù),如圖7所示。圖5加載真實數(shù)字地圖菜單圖7加載真實數(shù)字地圖后的數(shù)據(jù)顯示區(qū)域“數(shù)字地圖(M)”今“地圖顯示(S)”今“三維地形圖如圖8所示或者在工具欄上點擊“”彈出地形三維顯示對話框選擇顯示模式和9所示。顯示方式包括“鳥瞰”和“漫游”兩種,分別對地圖進行全貌顯示和三維漫游顯示;可以設(shè)定顯示的步長,以設(shè)定動畫演示的精細程度;還可以設(shè)置10圖8數(shù)字地圖三維顯示菜單圖10數(shù)字地圖三維顯示界面程序測試文檔軟件程序開發(fā)完后需要對軟件進行測試,測試軟件的各項功能,為軟件的修開提供參考意見。需要包括以下幾部分內(nèi)容。測試環(huán)境給出軟件測試程序的測試環(huán)境,形式可參照5.1節(jié)中軟件系統(tǒng)的開發(fā)環(huán)境。軟件測試項目和功能給出軟件需要測試哪些項目和功能。軟件測試數(shù)據(jù)及格式給出軟件測試時用到的數(shù)據(jù)及其格式。軟件測試過程給出軟件測試的詳細過程及每一步得到的結(jié)果,具體可參照5.2節(jié)的軟件使用方法。軟件程序調(diào)試文檔軟件程序開發(fā)與調(diào)試文檔是在整個軟件開發(fā)過程中記錄遇到的問題及解決的方法和調(diào)試過程,便于他人學(xué)習(xí)時方便地解決類似問題。具體形式可參照如下形式。問題一:虛擬機下創(chuàng)造可連接外網(wǎng)的環(huán)境問題:問題產(chǎn)生:apache服務(wù)器對機器的網(wǎng)絡(luò)設(shè)置要求和連接外網(wǎng)對機器的網(wǎng)絡(luò)設(shè)置要求相同,故可通過使機器連接外網(wǎng)的方式設(shè)置apache服務(wù)器使其正常運行。+HatLinux9.0+虛擬機軟件:VmwareWorkstation5.0雙系統(tǒng):Windowsxpsp3+fedora8連接外網(wǎng)??赏ㄟ^以下步驟進行:關(guān)閉宿主機防火墻,然后在宿主機中設(shè)置允許虛擬機虛擬的NetworkAdapterVmnet8”通過“本地連接”共享連接網(wǎng)絡(luò)。Ts

溫馨提示

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

最新文檔

評論

0/150

提交評論