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

下載本文檔

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

文檔簡介

1、C/C+編碼規(guī)范BELL實驗室的研究資料表明,軟件錯誤中18%左右產生于概要設計階段,15%左右產生于詳細設計階段,而編碼階段產生的錯誤占的比例則接近50%;分析表明,編碼階段產生的錯誤當中,語法錯誤大概占20%左右,而由于未嚴格檢查軟件邏輯導致的錯誤、函數(shù)(模塊)之間接口錯誤及由于代碼可理解 度低導致優(yōu)化維護階段對代碼的錯誤修改引起的錯誤則占了一半以上??梢?,提高軟件質量必須降低編碼階段的錯誤率。本文從代碼的可維護性(可讀、可理解性、可修改性)、代碼邏輯與效率、函數(shù)(模塊)接口、可測試性四個方面闡述了軟件編程規(guī)范,規(guī)范分成規(guī)則和建議兩種,其中規(guī)則部分為強制執(zhí)行項目,而建議部分則不作強制,可根

2、據(jù)習慣取舍。編碼規(guī)范 1.排版風格<規(guī)則 1> 程序塊采用縮進風格編寫,縮進為4個空格位。排版不混合使用空格和TAB鍵。<規(guī)則2> 在兩個以上的關鍵字、變量、常量進行對等操作時,它們之間的操作符之前、之后或者前后要加空格;進行非對等操作時,如果是關系密切的立即操作符(如->),后不應加空格。采用這種松散方式編寫代碼的目的是使代碼更加清晰。例如:(1) 逗號、分號只在后面加空格printf("%d %d %d" , a, b, c);(2)比較操作符, 賦值操作符"="、 "+=",算術操作符"+

3、"、"%",邏輯操作符"&&"、"&",位域操作符"<<"、""等雙目操作符的前后加空格 int i += 1;(3)"!"、""、"+"、"-"、"&"(地址運算符)等單目操作符前后不加空格i+;(4)"->"、"."前后不加空格p->id = pId; / "->"

4、;指針前后不加空格由于留空格所產生的清晰性是相對的,所以,在已經(jīng)非常清晰的語句中沒有必要再留空格,如最內層的括號內側(即左括號后面和右括號前面)不要加空格,因為在C/C+語言中括號已經(jīng)是最清晰的標志了。另外,在長語句中,如果需要加的空格非常多,那么應該保持整體清晰,而在局部不加空格。最后,即使留空格,也不要連續(xù)留兩個以上空格(為了保證縮進和排比留空除外)。<規(guī)則3> 函數(shù)體的開始,類的定義,結構的定義,if、for、do、while、switch及case語句中的程序都應采用縮進方式,、獨占一行并且位于同一列,同時與引用它們的語句左對齊正確書寫:for ( . ). / 程序代碼v

5、oid DoString( void ). / 程序代碼<規(guī)則4> 功能相對獨立的程序塊之間或for、if、do、while、switch等語句前后應加一空行。正確書寫:if(!IsValid(ni) /程序代碼 nPassId = SdnDataindex.nPassId; nPassNo = SdnDataindex.No; <規(guī)則5> if、while、for、case、default、do等語句自占一行。示例:如下例子不符合規(guī)范。if(pUserCR = NULL) return;正確書寫:If(pUserCR = NULL)return;<規(guī)則6>

6、 若語句較長(多于80字符),可分成多行寫,劃分出的新行要進行適應的縮進,使排版整齊,語句可讀。<規(guī)則7> 一行最多寫一條語句。<規(guī)則8> 對結構成員賦值,等號盡量對齊。示例:rect.top = 0;rect.left = 0;rect.right = 300;rect.bottom = 200; <規(guī)則9> #define的各個字段對齊 #define MAX_TASK_NUMBER 100#define BOTTOM_Y 400#define TOP_X 50<規(guī)則10> 不同類型的操作符混合使用時,使用括號給出優(yōu)先級。如本來是正確的代碼:

7、if(year % 4 = 0 | year % 100 != 0 && year % 400 = 0)如果加上括號,則更清晰。if(year % 4) = 0 | (year % 100) != 0 && (year % 400) = 0)2. 可理解性1.1 注釋注釋的原則是有助于對程序的閱讀理解,注釋不宜太多也不能太少,太少不利于代碼理解,太多則會對閱讀產生干擾,因此只在必要的地方才加注釋,而且注釋要準確、易懂、盡可能簡潔。注釋量一般控制在30%到50%之間。<規(guī)則1> 程序在必要的地方必須有注釋,注釋要準確、易懂、簡潔。例如如下注釋意義不大。

8、/* 如果bSnap為true */if (bSnap = true)而如下的注釋則給出了額外有用的信息。/* 如果相機拍照,X軸將移動到待拍位 */if (bSnap = true)<規(guī)則2> 注釋應與其描述的代碼相近,對代碼的注釋應放在其上方或右方(對單條語句的注釋)相鄰位置,不可放在下面,如放于上方則需與其上面的代碼用空行隔開。正確書寫:/*獲得相機拍照的圖片大小 */Int nImgSize = Cameraindex.nImgSize;<規(guī)則3> 對于所有的常量,變量,數(shù)據(jù)結構聲明(包括數(shù)組、結構、類、枚舉等),如果其命名不是充分自注釋的,在聲明時都必須加以注

9、釋,說明其含義。示例:/* 最大相機個數(shù) */#define MAX_CAMERA_NUM 1000/* 帶原始用戶信息的SCCP接口 */enum CAMERA_KINDCAM_DAHENG , /* 大恒相機 */CAM_MVC , /* 微視相機 */ ;<規(guī)則4> 頭文件、源文件的頭部,應進行注釋。注釋必須列出:文件名、作者、目的、功能、修改日志等。例如:/*fname:author:pxdate:descript:xgdate:*/說明:簡要描述一項描述本文件的目的和功能等。修改日期是修改日志列表,每條修改記錄應包括修改日期、修改者及修改內容簡述。<規(guī)則5>

10、函數(shù)頭部應進行注釋,列出:函數(shù)的目的、功能、輸入?yún)?shù)、輸出參數(shù)、修改日志等。形式如下:/*descript: / 函數(shù)目的、功能等的描述輸入: / 輸入?yún)?shù)說明,包括每個參數(shù)的作用、取值說明及參數(shù)間關系,輸出: / 輸出參數(shù)的說明, 返回值的說明修改日志:*/對一些復雜的函數(shù),在注釋中最好提供典型用法。<規(guī)則6> 仔細定義并明確公共變量的含義、作用、取值范圍及使用方法。在對變量聲明的同時,應對其含義、作用、取值范圍及使用方法進行注釋說明,同時若有必要還應說明與其它變量的關系。明確公共變量與操作此公共變量的函數(shù)或過程的關系,如訪問、修改及創(chuàng)建等。示例:/* SCCP轉換時錯誤代碼 *

11、/* 全局錯誤代碼,含義如下 */ / 變量作用、含義/* 0 - 成功 1 - GT 表錯誤 2 -GT 錯誤 其它值- 未使用 */ / 變量取值范圍<規(guī)則7> 對指針進行充分的注釋說明,對其作用、含義、使用范圍、注意事項等說明清楚。在對指針變量、特別是比較復雜的指針變量聲明時,應對其含義、作用及使用范圍進行注釋說明,如有必要,還應說明其使用方法、注意事項等。示例:/* 學生記錄列表的頭指針 */* 當在此模塊中創(chuàng)建該列表時,該頭指針必須初始化, */* 這樣可以利用GetListHead()獲得這一列表。*/ /指針作用、含義/* 該指針只在本模塊使用,其它模塊通過調用Get

12、ListHead()獲取*/* 當使用時必須保證它非空 */ /使用范圍、方法STUDENT_RECORD *pStudentRecHead;<規(guī)則8> 對重要代碼段的功能、意圖進行注釋,提供有用的、額外的信息。并在該代碼段的結束處加一行注釋表示該段代碼結束。<規(guī)則 9> 維護代碼時,要更新相應的注釋,刪除不再有用的注釋。保持代碼、注釋的一致性,避免產生誤解。1.2 命名本文列出Visual C+的標識符命名規(guī)范。<規(guī)則 1> 標識符縮寫形成縮寫的幾種技術:1) 去掉無用的單詞后綴 ing, ed等。如Paging Request寫成PagReq。2) 使用

13、標準的或慣用的縮寫形式(包括協(xié)議文件中出現(xiàn)的縮寫形式)。如BSIC(Base Station Identification Code)、MAP(Mobile Application Part)。關于縮寫的準則:1) 縮寫應該保持一致性。如Channel不要有時縮寫成Chan,有時縮寫成Ch。Length有時縮寫成Len,有時縮寫成len。2) 在源代碼頭部加入注解來說明協(xié)議相關的、非通用縮寫。3) 標識符的長度不超過32個字符。<規(guī)則2> 變量命名約定參照匈牙利記法,即作用范圍域前綴 + 前綴 + 基本類型 + 變量名其中:前綴是可選項,以小寫字母表示;基本類型是必選項,以小寫字母

14、表示;變量名是必選項,可多個單詞(或縮寫)合在一起,每個單詞首字母大寫。前綴列表如下:前綴 意義 舉例g_ Global 全局變量 g_MyVarm_ 類成員變量 或 模塊級變量 m_ListBox, m_Sizes_ static 靜態(tài)變量 s_Counth Handle 句柄 hWndp Pointer 指針 pTheWordlp Long Point 長指針 lpCmda Array 數(shù)組 aErr基本類型列表如下:基本類型 意義 舉例b Boolean 布爾 bIsOKby Byte 字節(jié) byNumc Char 字符 cMyChari或n Intger 整數(shù) nTestNumberu

15、 Unsigned integer 無符號整數(shù) unCountw Word 字 wParadw Double Word 雙字 dwParaf Float 浮點數(shù) fTotals String 字符串 sTempsz NULL結束的字符串 szTreesfn Funtion 函數(shù) fnAddenm 枚舉型 eDaysx,y x,y坐標部分控件:btn Buttonsta Staticedit Editimg Picturecbx Comborad Radiochk CheckBoxlist ListCtrltab TabControltree TreeControlsld Sliderprg P

16、rogressgbx GroupBox<規(guī)則3> 宏和常量的命名宏和常量的命名規(guī)則:單詞的字母全部大寫,各單詞之間用下劃線隔開。命名舉例:#define MAX_SIZE 8#define TEMP_INFO 0x07const int TEMP_SIZE=8<規(guī)則4> 結構和結構成員的命名結構名各單詞的首字母均為大寫??捎没虿挥胻ypedef,但是要保持一致,不能有的結構用typedef,有的又不用。如:typedef struct tag_MatorSettingint nStartSpeed;int nWorkSpeed; MatorSetting, *PMato

17、rSetting;結構成員的命名同變量的命名規(guī)則。<規(guī)則5> 枚舉和枚舉成員的命名枚舉名各單詞的字母均為大寫,單詞間用下劃線隔開。枚舉成員的命名規(guī)則:單詞的字母全部大寫,各單詞之間用下劃線隔開;要求各成員的第一個單詞相同。命名舉例:typdef enumTRIGGER_CONTINUE,TRIGGER_ONE, TRIGGER_MODE;<規(guī)則6> 類的命名在類前面加C。C 類 CMyClass<規(guī)則7> 函數(shù)的命名單詞首字母為大寫,其余均為小寫,單詞之間不用下劃線。函數(shù)名應以一個動詞開頭。命名舉例:void SetTrigger(void) ;<規(guī)則

18、8> 磐銳項目命名Pioneer + 項目名縮寫,如擺盤機:PioneerGbp接口API,以pr + “_” + 模塊 + “_” + 方法名,如相機保存圖像接口:pr_cam_saveImage(.)1.3 可維護性<規(guī)則1> 在邏輯表達式中使用明確的邏輯判斷。示例:如下邏輯表達式不規(guī)范。1) if (strlen(strName) )2) for (index = MAX_SSN_NUMBER; index ; index - ) 應改為如下:1) if (strlen(strName) != 0)2) for (index = MAX_SSN_NUMBER; inde

19、x != 0 ; index -)<規(guī)則2> 預編譯條件不應分離一完整的語句。 不正確:if ( cond = GLRUN)#ifdef DEBUG| (cond = GLWAIT)#endif)正確:#ifdef DEBUGif( cond = GLRUN | cond = GLWAIT )#elseif( cond = GLRUN )#endif<規(guī)則3> 在宏定義中合并預編譯條件。不正確:#ifdef EXPORTfor (i = 0; i < MAX_MSXRSM; i+)#elsefor (i = 0; i < MAX_MSRSM; i+)#end

20、if正確:頭文件中:#ifdef EXPORT#define MAX_MS_RSM MAX_MSXRSM#else#define MAX_MS_RSM MAX_MSRSM#endif源文件中:for( i = 0; i < MAX_MS_RSM; i+ )<規(guī)則4> 使用宏定義表達式時,要使用完備的括號。如下的宏定義表達式都存在一定的隱患。#define REC_AREA(a, b) a * b#define REC_AREA(a, b) (a) * (b)正確的定義為:#define REC_AREA(a, b) (a) * (b)<規(guī)則5> 宏所定義的多條表達

21、式應放在大括號內。示例:下面的語句只有宏中的第一條表達式被執(zhí)行。為了說明問題,for語句的書寫稍不符規(guī)范。#define INIT_RECT_VALUE( a, b ) a = 0 ; b = 0 ;for ( index = 0 ; index < RECT_TOTAL_NUM ; index + )INIT_RECT_VALUE( rect.a, rect.b ) ;正確的用法應為:#define INIT_RECT_VALUE( a, b ) a = 0 ; b = 0 ; for ( index = 0 ; index < RECT_TOTAL_NUM ; index +

22、)INIT_RECT_VALUE( rect index .a, rect index .b ) ;<規(guī)則6> 宏定義不能隱藏重要的細節(jié),避免有return,break等導致程序流程轉向的語句。<規(guī)則7> 結構中元素布局合理,一行只定義一個元素。如下例子不符合規(guī)范,typedef struct_UI left, top, right, bottom; RECT;應書寫稱:typedef struct_UI left; /* 矩形左側 x 坐標 */_UI top;_UI right;_UI bottom; RECT;<規(guī)則8> 枚舉值從小到大順序定義。<

23、;規(guī)則9> 包含頭文件時,使用相對路徑,不使用絕對路徑。如下引用:#include "c:switchincdef.inc"應改為:#include "incdef.inc"或#include "def.inc"<規(guī)則10> 每個函數(shù)的源程序行數(shù)原則上應該少于200行。對于消息分流處理函數(shù),完成的功能統(tǒng)一,但由于消息的種類多,可能超過200行的限制,不屬于違反規(guī)定。<規(guī)則11> 語句嵌套層次不得超過5層。嵌套層次太多,增加了代碼的復雜度及測試的難度,容易出錯,增加代碼維護的難度。<規(guī)則12>

24、用sizeof來確定結構、聯(lián)合或變量占用的空間。這樣可提高程序的可讀性、可維護性,同時也增加了程序的可移植性。<規(guī)則13> 避免相同的代碼段在多個地方出現(xiàn)。當某段代碼需在不同的地方重復使用時,應根據(jù)代碼段的規(guī)模大小使用函數(shù)調用或宏調用的方式代替。這樣,對該代碼段的修改就可在一處完成,增強代碼的可維護性。<規(guī)則14> 使用強制類型轉換。示例:USER_RECORD *pUser;pUser = (USER_RECORD *) malloc (MAX_USER * sizeof(USER_RECORD);<規(guī)則15> 避免使用 goto 語句。1.4. 程序正確

25、性、效率<規(guī)則1> 嚴禁使用未經(jīng)初始化的變量。引用未經(jīng)初始化的變量可能會產生不可預知的后果,特別是引用未經(jīng)初始化的指針經(jīng)常會導致系統(tǒng)崩潰,需特別注意。聲明變量的同時初始化,除了能防止引用未經(jīng)初始化的變量外,還可能生成更高效的機器代碼。<規(guī)則2> 定義公共指針的同時對其初始化。這樣便于指針的合法性檢查,防止應用未經(jīng)初始化的指針。建議對局部指針也在定義的同時初始化,形成習慣。<規(guī)則3> 較大的局部變量(2K以上)應聲明成靜態(tài)類型(static),避免占用太多的堆??臻g。避免發(fā)生堆棧溢出,出現(xiàn)不可預知的軟件故障。<規(guī)則4> 防止內存操作越界。說明:內存

26、操作主要是指對數(shù)組、指針、內存地址等的操作。內存操作越界是軟件系統(tǒng)主要錯誤之一,后果往往非常嚴重,所以當我們進行這些操作時一定要仔細小心。A.數(shù)組越界。char aMyArray10;for( i = 0; i <= 10; i+ )aMyArrayi = 0; /當i等于10時,將發(fā)生越界。B.指針操作越界。char aMyArray10;char *pMyArray;pMyArray = aMyArray;-pMyArray; / 越界pMyArray = aMyArray;pMyArray += 10; / 越界<規(guī)則5> 減少沒必要的指針使用,特別是較復雜的指針,如指

27、針的指針、數(shù)組的指針,指針的數(shù)組,函數(shù)的指針等。用指針雖然靈活,但也對程序的穩(wěn)定性造成一定威脅,主要原因是當要操作一個指針時,此指針可能正指向一個非法的地址。安安全全地使用一個指針并不是一件容易的事情。<規(guī)則6> 防止引用已經(jīng)釋放的內存空間。在實際編程過程中,稍不留心就會出現(xiàn)在一個模塊中釋放了某個內存塊(如指針),而另一模塊在隨后的某個時刻又使用了它。要防止這種情況發(fā)生。<規(guī)則7> 程序中分配的內存、申請的文件句柄,在不用時應及時釋放或關閉。分配的內存不釋放以及文件句柄不關閉,是較常見的錯誤,而且稍不注意就有可能發(fā)生。這類錯誤往往會引起很嚴重后果,且難以定位。<規(guī)

28、則8> 注意變量的有效取值范圍,防止表達式出現(xiàn)上溢或下溢。示例:unsigned char cIndex = 10;while( cIndex- >= 0 ) /將出現(xiàn)下溢當cIndex等于0 時,再減1不會小于0,而是0xFF,故程序是一個死循環(huán)。char chr = 127;chr += 1; /127為chr的邊界值,再加1將使chr上溢到-128,而不是128。<規(guī)則9> 防止精度損失。以下代碼將產生精度丟失。#define DELAY_MILLISECONDS 10000char time;time = DELAY_MILLISECONDS;WaitTime(

29、 time );代碼的本意是想產生10秒鐘的延時,然而由于time為字符型變量,只取DELAY_MILLISECONDS的低字節(jié),高位字節(jié)將丟失,結果只產生了16毫秒的延時。<規(guī)則12> switch語句的程序塊中必須有default語句。對不期望的情況(包括異常情況)進行處理,保證程序邏輯嚴謹。<規(guī)則13> 循環(huán)體內工作量最小化。應仔細考慮循環(huán)體內的語句是否可以放在循環(huán)體之外,使循環(huán)體內工作量最小,從而提高程序的時間效率。示例:如下代碼效率不高。for ( i= 0 ; i< MAX_ADD_NUMBER ; i+ )nSum += i;nBackSum = n

30、Sum ; /* 備份和 */正確代碼如下。for ( i = 0 ; i < MAX_ADD_NUMBER ; i + )nSum += i ;nBackSum = nSum ; /*備份和 */<規(guī)則14> 在多重循環(huán)中,應將最忙的循環(huán)放在最內層。<規(guī)則15> 避免循環(huán)體內含判斷語句,將與循環(huán)變量無關的判斷語句移到循環(huán)體外。目的是減少判斷次數(shù)。循環(huán)體中的判斷語句是否可以移到循環(huán)體外,要視程序的具體情況而言,一般情況,與循環(huán)變量無關的判斷語句可以移到循環(huán)體外,而有關的則不可以。<規(guī)則16> 盡量用乘法或其它方法代替除法,特別是浮點運算中的除法,在時間

31、效率要求不是特別嚴格時,要優(yōu)先保證程序的可讀性。說明:浮點運算除法要占用較多CPU資源。示例:如下表達式運算可能要占較多CPU資源。#define PAI 3.1416fRadius = fCircleLength / ( 2 * PAI ) ;應如下把浮點除法改為浮點乘法。#define PAI_RECIPROCAL ( 1 / 3.1416 ) / 編譯器編譯時,將生成具體浮點數(shù)fRadius = fCircleLength * PAI_RECIPROCAL / 2 ; 1.5 接口<規(guī)則1> 頭文件應采用 #ifndef / #define / #endif 的方式來防止多次

32、被嵌入或采用#pragma once。示例如下:假設頭文件為揇EF.INC",則其內容應為:#ifndef _DEF_INC#define _DEF_INC.#endif<規(guī)則2> 去掉沒有必要的公共變量,編程時應盡量少用公共變量。公共變量是增大模塊間耦合的原因之一,故應減少沒必要的公共變量以降低模塊間的耦合度。應該構造僅有一個模塊或函數(shù)可以修改、創(chuàng)建,而其余有關模塊或函數(shù)只訪問的公共變量,防止多個不同模塊或函數(shù)都可以修改、創(chuàng)建同一公共變量的現(xiàn)象。<規(guī)則3> 當向公共變量傳遞數(shù)據(jù)時,要防止越界現(xiàn)象發(fā)生。對公共變量賦值時,若有必要應進行合法性檢查,以提高代碼的可

33、靠性、穩(wěn)定性。<規(guī)則4> 返回值為指針的函數(shù),不可將局部變量的地址作為返回值。當函數(shù)退出時,非static局部變量將消失,所以引用返回的指針將可能引起嚴重后果。下例將不能完成正確的功能。char *GetFilename(int nFileNo)char szFileName20;sprintf( szFileName, "COUNT%d", nFileNo);return szFileName;<規(guī)則5> 盡量不設計多參數(shù)函數(shù),將不使用的參數(shù)從接口中去掉,降低接口復雜度。減少函數(shù)間接口的復雜度。<規(guī)則6> 對所調用函數(shù)的返回碼要仔細、全

34、面地處理。防止把錯誤傳遞到后面的處理流程。如有意不檢查其返回碼,應明確指明。 如:(void)fclose(fp);<規(guī)則7> 顯示地給出函數(shù)的返回值類型。無返回值函數(shù)定義為void。C、C+語言的編譯系統(tǒng)默認無顯示返回值函數(shù)的返回值類型為int。<規(guī)則8> 聲明函數(shù)原型時給出參數(shù)名稱和類型,并且與實現(xiàn)此函數(shù)時的參數(shù)名稱、類型保持一致,無參數(shù)的函數(shù),用void聲明。示例:下面聲明不正確。int CheckData( ) ;int SetPoint( int, int ) ;int SetPoint( x, y )int x, y;應改為如下聲明:int CheckDat

35、a( void ) ;int SetPoint( int x, int y ) ;<規(guī)則9> 檢查接口函數(shù)所有輸入?yún)?shù)的有效性??芍苯訖z查或使用斷言進行檢查,尤其是指針參數(shù)。只在本模塊內使用的函數(shù)可不檢查。<規(guī)則10> 檢查函數(shù)的所有非參數(shù)輸入,如數(shù)據(jù)文件、公共變量等。可直接檢查或使用斷言進行檢查,尤其是指針變量。<規(guī)則11> 聲明函數(shù)原型時,對于數(shù)組型參數(shù),不要聲明為指針,維護函數(shù)接口的清晰性。示例:假設函數(shù)SortInt()完成的功能是對一組整數(shù)排序,接受的參數(shù)是一整數(shù)數(shù)組及數(shù)組中的元素個數(shù),以下聲明不符合規(guī)范。void SortInt(int num,

36、 int *data);應聲明為:void SortInt(int num, int data);1.6 代碼可測性<規(guī)則1> 模塊編寫應該有完善的測試方面的考慮。<規(guī)則2> 源代碼中應該設計了代碼測試的內容,如打印宏開關、變量值、函數(shù)名稱、函數(shù)值等。在編寫代碼之前,應預先設計好程序調試與測試的方法和手段,并設計好各種調測開關及相應測試代碼如打印函數(shù)等。程序的調試與測試是軟件生存周期中很重要的一個階段,如何對軟件進行較全面、高率的測試并盡可能地找出軟件中的錯誤就成為很關鍵的問題。因此在 編寫源代碼之前,除了要有一套比較完善的測試計劃外,還應設計出一系列代碼測試手段,為單

37、元測試、集成測試及系統(tǒng)聯(lián)調提供方便。<規(guī)則3> 在同一項目組或產品組內,調測打印出的信息串的格式要有統(tǒng)一的形式。信息串中至少要有所在模塊名(或源文件名)及行號。統(tǒng)一的調測信息格式便于集成測試。<規(guī)則4> 使用斷言來發(fā)現(xiàn)軟件問題,提高代碼可測性。斷言是對某種假設條件進行檢查(可理解為若條件成立則無動作,否則應報告),它可以快速發(fā)現(xiàn)并定位軟件問題,同時對系統(tǒng)錯誤進行自動報警。斷言 可以對在系統(tǒng)中隱藏很深,用其它手段極難發(fā)現(xiàn)的問題進行定位,從而縮短軟件問題定位時間,提高系統(tǒng)的可測性。實際應用時,可根據(jù)具體情況靈活地設計斷言。示例:下面是C語言中的一個斷言,用宏來設計的。(其中

38、NULL為0L)#ifdef _EXAM_ASSERT_TEST_ / 若使用斷言測試void ExamAssert( char * szFileName, unsigned int nLineNo )printf( "nEXAM Assert failed: %s, line %un",szFileName, nLineNo ) ;abort( ) ;#define EXAM_ASSERT( condition ) if ( condition ) / 若條件成立,則無動作NULL ; else / 否則報告ExamAssert( _FILE_, _LINE_ )#els

39、e / 若不使用斷言測試#define EXAM_ASSERT( condition ) NULL#endif /* ASSERT結束 */<規(guī)則5> 用斷言來檢查程序正常運行時不應發(fā)生但在調測時有可能發(fā)生的非法情況。<規(guī)則6> 不能用斷言代替錯誤處理來檢查最終產品肯定會出現(xiàn)且必須處理的錯誤情況。如某模塊收到其它模塊或鏈路上的消息后,要對消息的合理性進行檢查,此過程為正常的錯誤檢查,不能用斷言來代替。<規(guī)則7> 用斷言確認函數(shù)的參數(shù)。示例:假設某函數(shù)參數(shù)中有一個指針,那么使用指針前可對它檢查,如下。int ExamFunc( unsigned char *str )EXAM_

溫馨提示

  • 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

提交評論