VC中用於偵錯工具的幾個宏的提示

來源:互聯網
上載者:User
VC中用於偵錯工具的幾個宏的提示
http://www.51cto.com 2005-09-22 11:22 作者:neverthink 出

【導讀】本文介紹了VC中用於偵錯工具的幾個宏的提示

 

一、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資訊,這類錯誤將很難被發現。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.