国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

VC中用于調試程序的幾個宏的使用技巧

2019-11-17 05:12:56
字體:
來源:轉載
供稿:網友
一、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、TRACE1、TRACE2和TRACE3宏,它們的參數分別為0、1、2、3。
 
二、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—語句是處理器標志,它們分別指定了源文件名和當前的行號。
 
三、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信息,這類錯誤將很難被發現。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 洛宁县| 临猗县| 旬阳县| 邓州市| 当阳市| 莫力| 韶关市| 宣威市| 新乡市| 昭通市| 武乡县| 积石山| 高台县| 定兴县| 正镶白旗| 土默特左旗| 怀来县| 榆树市| 冀州市| 普定县| 齐齐哈尔市| 商洛市| 怀安县| 绥化市| 新乐市| 菏泽市| 尚志市| 元谋县| 东台市| 布尔津县| 伽师县| 绥芬河市| 册亨县| 平利县| 甘孜| 张掖市| 苍溪县| 临清市| 牡丹江市| 高台县| 台州市|