VC中TRACE ASSERT VERIFY之用法

1、TRACE宏
 
 
當選擇了Debug目標,而且afxTraceEnabled變量被置爲TRUE時,TRACE宏也就隨之被激活了。但在程序的Release版本中,它們是被徹底禁止的。下面是一個典型的TRACE語句:
    …
        int nCount =9;
        CString strDesc("total");
        TRACE("Count =%d,Description =%s\n",nCount,strDesc);
        
 
能夠看到,TRACE語句的工做方式有點像C語言中的printf語句,TRACE宏參數的個數是可變的,所以使用起來很是容易。若是查看MFC的源代碼,你根本找不到TRACE宏,而只能看到TRACE0、TRACE一、TRACE2和TRACE3宏,它們的參數分別爲0、一、二、3。
 
 
我的總結:最近看網絡編程是碰到了TRACE語句,不知道在哪裏輸出,查了一夜資料也沒找出來,今天終於在CSDN上找到了,真是個高地方啊,方法以下:
1.在MFC中加入TRACE語句
2.在TOOLS->MFC TRACER中選擇 「ENABLE TRACING」點擊OK
3.進行調試運行,GO(F5)(特別注意:不是執行‘!’之前之因此不能看到TRACE內容,是由於不是調試執行,而是‘!’了,切記,切記)
4.而後就會在OUTPUT中的DEBUG窗口中看到TRACE內容了,調試執行會自動從BUILD窗口跳到DEBUG窗口,在那裏就看到TRACE的內容了,^_^
如下是找的TRACE的詳細介紹:
 ==============================
       TRACE宏對於VC下程序調試來講是頗有用的東西,有着相似printf的功能;該宏僅僅在程序的DEBUG版本中出現,當RELEASE的時候該宏就徹底消息了,從而幫助你調式也在RELEASE的時候減小代碼量。
使用很是簡單,格式以下:
TRACE("DDDDDDDDDDD");
TRACE("wewe%d",333);
一樣還存在TRACE0,TRACE1,TRACE2。。。分別對應0,1,2。。個參數
TRACE信息輸出到VC IDE環境的輸出窗口(該窗口是你編譯項目出錯提示的哪一個窗口),但僅限於你在VC中運行你的DEBUG版本的程序。
TRACE信息還可使用DEBUGVIEW來捕獲到。這種狀況下,你不能在VC的IDE環境中運行你的程序,而將BUILD好的DEBUG版本的程序單獨運行,這個時候能夠在DEBUGVIEW的窗口看到DEBUGVIE格式的輸出了。
VC中TRACE的用法有如下四種:
1:
TRACE   ,就是不帶動態參數輸出字符串,   相似C的printf("輸出字符串"); 
    
2:
TRACE   中的字符串能夠帶一個參數輸出   , 相似C的printf("...%d",變量);
3:
TRACE   能夠帶兩個參數輸出,相似C的printf("...%d...%f",變量1,變量2);
4:
TRACE 能夠帶三個參數輸出,相似C的printf("...%d,%d,%d",變量1,變量2,變量3);
TRACE 宏有點象咱們之前在C語言中用的Printf函數,使程序在運行過程當中輸出一些調試信息,使咱們能瞭解程序的一些狀態。但有一點不一樣的是:

TRACE 宏只有在調試狀態下才有所輸出,而之前用的Printf 函數在任何狀況下都有輸出。和Printf 函數同樣,TRACE函數能夠接受多個參數如:
int x = 1;
int y = 16;
float z = 32.0;
TRACE( "This is a TRACE statement\n" );
TRACE( "The value of x is %d\n", x );
TRACE( "x = %d and y = %d\n", x, y );
TRACE( "x = %d and y = %x and z = %f\n", x, y, z );
要注意的是TRACE宏只對Debug 版本的工程產生做用,在Release 版本的工程中,TRACE宏將被忽略。
 
 
 
 
 
 
2、ASSERT宏
 
若是你設計了一個函數,該函數須要一個指向文檔對象的指針作參數,可是你卻錯誤地用一個視圖指針調用了這個函數。這個假的地址將致使視數據的破壞。如今,這種類型的問題能夠被徹底避免,只要在該函數的開始處實現一個ASSERT測試,用來檢測該指針是否真正指向一個文檔對象。通常來說,編程者在每一個函數的開始處均應例行公事地使用assertion。ASSERT宏將會判斷表達式,若是一個表達式爲真,執行將繼續,不然,程序將顯示一條消息而且暫停,你能夠選擇忽視這條錯誤並繼續、終止這個程序或者是跳到Debug器中。下面一例演示瞭如何使用一個ASSERT宏去驗證一個語句。
 
void foo( char p, int size )  
        {
               ASSERT( p != 0  ); //確認緩衝區的指針是有效的
       ASSERT( ( size >= 100  ); //確認緩衝區至少有100個字節
              // Do the foo calculation
}
這些語句不產生任何代碼,除非—DEBUG處理器標誌被設置。Visual C++只在Debug版本設置這些標誌,而在Release版本不定義這些標誌。當—DEBUG被定義時,兩個assertions將產生以下代碼:
 
//ASSERT( p != 0 );
       do{
       if( !(p != 0) && AfxAssertFailedLine(—FILE—,—LINE—) )
              AfxDebugBreak();
       }while(0);
 
       //ASSERT((size 〉= 100);
       do{
       if(!(size 〉= 100) &&AfxAssertFailedLine(—FILE—,—LINE—))
              AfxDebugBreak();
}while(0);
 
 
Do-while循環將整個assertion封裝在一個單獨的程序塊中,使得編譯器編譯起來很舒暢。If語句將求取表達式的值而且當結果爲零時調用AfxAssertFailedLine()函數。這個函數將彈出一個對話框,其中提供三個選項「取消、重試或忽略」,當你選取「重試」時,它將返回TRUE。重試將致使對AfxDebugBreak()函數的調用,從而激活調試器。
 
Do-while循環將整個assertion封裝在一個單獨的程序塊中,使得編譯器編譯起來很舒暢。If語句將求取表達式的值而且當結果爲零時調用AfxAssertFailedLine()函數。這個函數將彈出一個對話框,其中提供三個選項「取消、重試或忽略」,當你選取「重試」時,它將返回TRUE。重試將致使對AfxDebugBreak()函數的調用,從而激活調試器。
 
AfxAssertFailedLine()是一個未正式公佈的函數,它的功能就是顯示一個消息框。該函數的源代碼駐留在afxasert.cpp中。函數中的—FILE—和—LINE—語句是處理器標誌,它們分別指定了源文件名和當前的行號。
 
AfxAssertFailedLine()是一個未正式公佈的函數,它的功能就是顯示一個消息框。該函數的源代碼駐留在afxasert.cpp中。函數中的—FILE—和—LINE—語句是處理器標誌,它們分別指定了源文件名和當前的行號。
 
 
3、VERIFY 宏
 
 
 
由於assertion只能在程序的Debug版本中起做用,在表達式中不能夠包含賦值語句、增長語句(++)或者是減小語句(--),由於,這些語句實際改變數據。可有時你可能想要驗證一個能動的表達式,使用一個賦值語句。那麼就到了用VERIFY宏來替代ASSERT。例如:
 
 
void foo(char p, int size )
        {
               char q;
               VERIFY(q = p);
               ASSERT((size 〉= 100);
               // Do the foo calculation
               // Do the foo calculation
        }
 
 
 
在Debug模式下,ASSERT和VERIFY是一回事,可是在Release模式下,VERIFY宏仍然測試表達式而assertion卻不起任何做用。能夠說,在Release模式下,ASSERT語句被刪除了。
 
請注意,若是你在一個ASSERT語句中錯誤地使用了一個能動的表達式,編譯器將不作任何警告地忽略它。在Release模式下,該表達式就會被無聲息地刪除掉,這將會致使程序的錯誤運行。因爲Release版的程序一般不包含Debug信息,這類錯誤將很難被發現。
相關文章
相關標籤/搜索