ASSERT與VERIFY的區別

1 ASSERT與VERIFY宏在Debug模式下作用基本一致,二者都對表達式的值進行計算,如果值爲非0,則什麼事也不做;如果值爲0,則輸出診斷信息。


2 ASSERT與VERIFY宏在Release模式下效果完全不一樣。ASSERT不計算表達式的值,也不會輸出診斷信息;VERIFY計算表達式的值,但不管值爲0還是非0都不會輸出診斷信息。VERIFY與ASSERT用在程序調試上並無本質上的區別。   
 

斷言類型 定義

ANSI C 斷言

void assert(int expression );

C Runtime Lib 斷言

_ASSERT( booleanExpression );
_ASSERTE( booleanExpression );

MFC 斷言

ASSERT( booleanExpression );
VERIFY( booleanExpression );
ASSERT_VALID( pObject );
ASSERT_KINDOF( classname, pobject );

ATL 斷言

ATLASSERT( booleanExpression );

此外,TRACE() 宏的編譯也受 _DEBUG 控制。所有這些斷言都只在 Debug版中才被編譯,而在 Release 版中被忽略。唯一的例外是 VERIFY() 。事實上,這些宏都是調用了 assert() 函數,只不過附加了一些與庫有關的調試代碼。如果你在這些宏中加入了任何程序代碼,而不只是布爾表達式(例如賦值、能改變變量值的函數調用 等),那麼 Release 版都不會執行這些操作,從而造成錯誤。初學者很容易犯這類錯誤,查找的方法也很簡單,因爲這些宏都已在上面列出,只要利用 VC++ 的 Find in Files 功能在工程所有文件中找到用這些宏的地方再一一檢查即可。另外,有些高手可能還會加入 #ifdef _DEBUG 之類的條件編譯,也要注意一下。
順便值得一提的是 VERIFY() 宏,這個宏允許你將程序代碼放在布爾表達式裏。這個宏通常用來檢查 Windows API 的返回值。有些人可能爲這個原因而濫用 VERIFY() ,事實上這是危險的,因爲 VERIFY() 違反了斷言的思想,不能使程序代碼和調試代碼完全分離,最終可能會帶來很多麻煩。因此,專家們建議儘量少用這個宏

 

發佈了19 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章