ASSERT()被測試它的參數,如果參數為零,則中斷執行並打印一段說明消息。在Release版本的程序中它不起任何作用。
ASSERT()使用的時候必須保證參數表達式中不能有函數調用,因此對於任何有函數調用的參數表達式,應該使用宏VERIFY(),以保證表達式中的函數調用在Release版本中會被正確求值。
斷言(assertion)用斷言信息(程序,模塊,assertion行)的對話框執行,對話框右三個按鈕:"Break ","Re[eat"("Debug"),and "continue"("Ignore"). "Break"結束程序,"continue"忽略斷言,最有用的是"Repeat"按鈕,按下它在斷言的地方開源代碼編輯器。在這裡你可以測試所有的變量並明白哪裡出了問題。
例如:ASSERT(pPointer);ASSERT(n>0 && n<100);ASSERT(0);
ASSERT在執行簡單驗證時很有用,但對於c++對象,特別是用cobject派生的對象,則有更好的方法ASSERT_VALID來實現類似操作。作為一般規則,我們應在開始時用每一個對象之前檢查數據訛誤,
ASSERT_VALID(this);ASSERT_VALID(pView);
VERIFY()
VERIFY ()和ASSERT()很相似,區別在於Release版本中它仍然有效.
TRACE()
TRACE()基本上就是函數printf()的一個復制品,唯一的區別在於它把結果輸出到調試窗口。在Release版本中它是無效的。一般是用TRACE0(),TRACE1()。TRACE2()。。。而不用TRACE()。
這三個宏在Release版本中都不會產生任何實質性的影響,他們是否起作用取決於是否定義了預訂義了宏/
常用用法:
為了控制傳用指針:
void SomeFun(SomeType* pPointer)
{
ASSERT(pPointer);
//some instrctions。
}
你可以在“switch”和“if”操作中捕獲奇怪的值
例如:if(nWaterTemp〉=0 && nWaterTemp<50)
{
//some instrction
}
else if(nWaterTemp>=50 && nWaterTemp<=100
{
//some instruction.
}
else {
ASSERT(0);
}
對值得斷言:
ASSERT(nSomeValue>=MinValue and nSomeValue<=MaxValue);
ASSERT(nOtherValue !=0)