您的位置:首页 > 编程语言 > C语言/C++

在VC++中使用斷言

2004-08-19 14:27 246 查看
在VC++中使用斷言

1??????? 斷言的表達形式

1.1????? 語法

斷言是一個宏,格式為: ASSERT( 邏輯表達式 booleanExpression)
邏輯表達式可以是任意一個表達式,其值是0或者非0。
從代碼的可讀性角度來講,這個表達式應該是不包含與布爾型變量的邏輯比較操作的。

1.2????? 作用

斷言僅僅在Debug過程中產生作用。
當邏輯表達式出現了FALSE(0)的時候,編譯程序將自動停止程序的運行,並給出相關的程序診斷信息。
對於Release版本的代碼,ASSERT宏不會被處理,因而不會對程序的正常運行其任何阻攔作用。對於MFC,假如希望在Release版本中依然有類似的功能,可以使用VERIFY宏。該宏作用和斷言類似。

1.3????? 診斷信息

assertion failed in file in line
以上為診斷信息的格式。其中file name代表了出錯程序代碼所在的文件,line number是該出現問題的斷言所在行。

2??????? 斷言的使用方法

2.1????? 函數調用正確性檢查

可以檢查函數參數的合理性。
在實際工作中,有些函數需要輸入參數滿足一些假定條件,而這些約束條件不是數據類型可以滿足的。比如下面的代碼,要根據三個邊長求一個直角三角形的某些參數,必須確認這三個邊長是合理的。
Type GetValue(int a, int b, int c)
{
??? ASSERT( (a <= c) && (b <= c) ) //specify the third parameter as the largest
??? ASSERT( (a * a + b * b) == c*c )
??? //To do something
………
//End function
}
在這裡,斷言第三個參數必須是最大的邊長,之後,進一步要求兩個短邊的平方和必須等於長邊的平方。
類似的,我們可以用判斷主調給出的指針是否有效。
……
ASSERT(NULL != pOutBuffer)
…...
在函數內檢測參數的合理性有兩個好處:
1 保證函數本身的健壯性;
2 使問題容易定位。
主調給出的參數有時候可能是莫名其妙的,使用斷言,能夠發現許多難以發現的邏輯錯誤。

2.2????? 檢查內存分配

在MFC中,由於windows的虛擬內存,Release以後的程序是不可能耗盡內存的。因此,如果用普通代碼檢查分配內存成功與否,效率是不合算的,最好使用斷言。
例如:
……
pBuf = (char *) malloc( sizeof(char) * 100 );
ASSERT( NULL != pBuf )
……
這樣既不降低碼執行效率,又能檢查分配內存是否成功。

2.3????? 防治野指針

大概在定義指針的時候人人都懂得初始化吧:
int *pCount = NULL;
然後分配空間,
pCount = new int[ 10 ];
 process…
? 之後釋放空間:
 delete []pCount;
 這時候,pCount指向哪裡呢? 還是原來的地址,然而改地址已經被系統釋放了,於是這個指針就變成了”野指針”,如果使用,必然導致錯誤。在這裡,應該使用斷言來確保賦了NULL值。
 pCount = NULL;
? ……
? ASSERT ( NULL == pCount ); //if you’ve forgotten delete,here will output an alart.
? 牢記,在給一個指針釋放空間之後用斷言確保這個指針已經賦了NULL,以免出現野指針。

2.4????? MSDN範例

// example for ASSERT
CAge* pcage = new Cage[ 21 ]; // CAge is derived from CObject.
ASSERT( pcage!= NULL )
ASSERT( pcage->IsKindOf( RUNTIME_CLASS( CAge ) ) )
// Terminates program only if pcage is NOT a CAge*.

以上為MSDN中對於斷言使用的範例,在這裡確保了pcage指向的對象是有效的Cage類。

3??????? 注意事項

1 斷言捕捉的是非法操作的情況,而不是錯誤。不要試圖用斷言來排錯。
2 一旦函數對參數有任何假定,一定要在函數的入口處使用斷言來確認假定是否實現。
3 給每一個斷言加上注釋,以便使斷言有目的的防錯。
?
參考資料[/b][/b]
1 Steve Maguire, Writing Clean Code.
2林銳,高質量C/C++編程指南
3 Microsoft,MSDN document
?
V1.0 2003/9/9
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: