assert和verify的區別
1 assert與verify巨集在debug模式下作用基本一致,二者都對表示式的值進行計算,如果值為非0,則什麼事也不做;如果值為0,則輸出診斷資訊。
2 assert與verify巨集在release模式下效果完全不一樣。assert不計算表示式的值,也不會輸出診斷資訊;verify計算表示式的值,但不管值為0還是非0都不會輸出診斷資訊。
verify 與assert用在程式除錯上並無本質上的區別。
in the debug version of mfc, the verify macro evaluates its argument. if the result is 0,
the macro prints a diagnostic message and halts the program. if the condition is nonzero,
it does nothing.
in the release version of mfc, verify evaluates the expression but does not print or interrupt the program. for example, if the expression is a function call, the call will be made.
斷言型別 定義
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() 違反了斷言的思想,不能使程式**和除錯**完全分離,最終可能會帶來很多麻煩。因此,專家們建議盡量少用這個巨集。
斷言 assert 與驗證 verify
斷言 assert 與驗證 verify 什麼時候使用斷言命令,什麼時候使用驗證命令?這取決於你。差別在於在檢查失敗時,你想讓測試程式 做什麼。你想讓測試終止,還是想繼續而只簡單地記錄檢查失敗?這需要權衡。如果您使用的斷言,測試將在檢查失敗時停止,並不執行任何後續的檢查。有時候,也許是 經常的,這是...
ASSERT與VERIFY巨集的區別
1 assert與verify巨集在debug模式下作用基本一致,二者都對表示式的值進行計算,如果值為非0,則什麼事也不做 如果值為0,則輸出診斷資訊。2 assert與verify巨集在release模式下效果完全不一樣。assert不計算表示式的值,也不會輸出診斷資訊 verify計算表示式的值...
ASSERT與VERIFY巨集的區別
今天公司有同事問我assert與verify巨集有什麼區別,雖然平時常用這兩個巨集對一些變數在debug模式下作判斷,但一時還真答不上來二者之間的具體差別,看來只是知其然不知其所以然。後來查了一些資料,總算弄清楚了二者之間的區別,整理後與同事交流了一番,感覺收穫還是蠻大的。下面對我的理解進行了總結 ...