ASSERT VERIFY TRACE的區別與應用

來源:互聯網
上載者:User

使用斷言assert()宏是用於保證滿足某個特定條件,用法是:
assert(運算式);
如果運算式的值為假,整個程式將退出,並輸出一條錯誤資訊。如果表達

式的值為真則繼續執行後面的語句。
使用這個宏前需要包含標頭檔assert.h
例如
#include <stdio.h>
#include <assert.h>
void main()
{
   float a,b;
   scan("%f %f",&a,&b);
   assert(b!=0);
   printf("%f/n",a/b);
}
以上的程式要計算A/B的值,因此要求b!=0,所以在程式中使用了assert()

用於確保b!=0,如果b==0,則程式會退出。
VC中分兩個版本debug,release.ASSERT()只用於debuge版本中,用來測試

括弧內的運算式是否為真的,比如說每個數X是不可能為0的,就可以這樣

寫ASSERT(X);,不過這條語句在你release時是不會產生代碼去檢查這個

值的,只有在debug時才生效。
即ASSERT()是一種判斷語句,主要用來偵錯工具。詳解ASSERT(

booleanExpression );
1、booleanExpression參數是一個BOOL運算式。
2、當程式運行到該語句的時候,程式會檢查booleanExpression這個表達

式是真還是假。
當條件滿足時,程式繼續運行下面的代碼;
當條件不滿足時,那麼程式要持續運行會被卡在這裡,不在向下執行,並

由程式彈出錯誤對話方塊,指出是由於booleanExpression這個條件不滿足

導致的錯誤。
3、該指令可以用來作為某些條件的防護,避免不合格東西產生導

致程式的崩潰。

 ASSERT與VERIFY宏在Debug模式下作用基本一致,二者都對錶達式的值進

行計算,如果值為非0,則什麼事也不做;如果值為0,則輸出診斷資訊。

然而二者在Release模式下效果完全不一樣。ASSERT不計算運算式的值,

也不會輸出診斷資訊;VERIFY計算運算式的值,但不管值為0還是非0都不

會輸出診斷資訊。
 
斷言(assertion)用帶斷言資訊(程式, 模組, assertion行)的對話方塊執行

. 對話方塊有3個按鈕: "Break", "Repeat" ("Debug"), and "Continue"

("Ignore"). "Break" 結束程式, "Continue" 忽略斷言, 最有用的

是"Repeat"按鈕. 按下它在斷言的地方開啟原始碼編輯器. 在這裡你可以

測試所有的變數值並明白哪裡出了問題。
例如:ASSERT(pPointer);ASSERT(n>0 && n<100);ASSERT(0);
ASSERT在執行簡單驗證時很有用,但對於C++對象,特別是由CObject派生

的對象,則有更好的方法ASSERT_VALID來實作類別似操作。作為一般規則,

我們應在開始使用每一個對象之前檢查資料訛誤,
ASSERT_VALID宏使得對CObject的衍生類別實現該操作非常簡單。
例如:ASSERT_VALID(this);ASSERT_VALID(pView);
VERIFY()
    VERIFY()和 ASSERT()很相似,區別在於在 Release 版本中它仍然有

效(譯者註:原作者在這裡沒有講清楚,VERIFY()不會列印說明,只是會

對參數運算式求值)。
TRACE()
    TRACE()基本上就是函數 printf()的一個複製品,唯一的區別是它把

結果輸出到調試視窗。在 Release 版本中,它也是無效的。一般是用

TRACE0(),TRACE1(),TRACE2()…而不用TRACE()。
? 這三個宏在 Release 版本中都不會產生任何實質性的影響,它們是否

起作用取決於是否定義了預定義了宏 _DEBUG。這是對 Microsoft Visual

C++ 而言,在其它的編譯器中可能其它不同的宏。
常用用法:
為了控制傳進的指標:
void SomeFun(SomeType* pPointer)
{
  ASSERT(pPointer);
 //some instructions.
}
你可以在"switch" 和 "if"操作中捕獲奇怪的值
例如:
switch(nRGBColors){
  case nRed:  {//some instructions.} break;
  case nGreen: {//some instructions.} break;
  case nBlue:  {//some instructions.} break;
  default: ASSERT(0);    // we should have never come here!
}
if(nWaterTemp >=0 && nWaterTemp < 50){
  //some instructions.
}
else if(nWaterTemp >= 50 && nWaterTemp <= 100){
  //some instructions.
}
else{
  ASSERT(0);    // we should have never come here!
}
對值的斷言:
ASSERT(nSomeValue >= MinValue and nSomeValue <= MaxValue);
ASSERT(nOtherValue != 0);
 
可愛的 ASSERT 錯誤
ASSERT( m_MyWnd.Create() );
嘔! 這是一個可怕的錯誤! 程式在調試版中正常工作, 在發行版中不工作

. 記住: 這是一個在發行版中將被移除的宏. 以這種方法你的視窗將永遠

不會被建立. 如果你用 MFC, 這樣做:
VERIFY( m_MyWnd.Create() );
它在調試版中像ASSERT一樣並且在發行版中執行m_MyWnd.Create()。

處於debug模式下時:
當測試的值為0,則ASSERT會提示出錯,並中斷程式執行。而VERIFY也會

報錯,但只是暫停程式執行。

處於release模式下時:
ASSERT語句會被忽略,如同不存在;而VERIFY語句本身不執行,但其括弧

裡的語句能執行,其結果值可用,由於verify的不執行所以不會報錯,也

不暫停程式的執行。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.