您的位置: 旅游網 > 綜藝 >> 天天向上

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

    發布時間:2021-10-28 05:38:38

    一、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()是一個未正式公布的函數,它的功能就是顯示一個消息框。該函數的源代碼駐留在p中。函數中的—FILE—和—LINE—語句是處理器標志,它們分別指定了源文件名和當前的行號。

    AfxAssertFailedLine()是一個未正式公布的函數,它的功能就是顯示一個消息框。該函數的源代碼駐留在p中。函數中的—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信息,這類錯誤將很難被發現。

    查看本文來源

    長沙婦科哪家醫院好
    石家莊專業治療牛皮癬醫院
    昆明包皮包莖治療多少錢
    猜你會喜歡的
    猜你會喜歡的
    主站蜘蛛池模板: 久久综合九色综合欧美狠狠| 制服丝袜自拍偷拍| 99精品在线视频| 日韩一中文字幕| 亚洲精品国产精品国自产网站| 视频一区精品自拍| 国产精品福利一区二区久久| 三上悠亚日韩精品一区在线| 最近最新中文字幕2018中文字幕mv| 俄罗斯精品bbw| 超级无敌科技帝国| 国产精品嫩草影院在线| www一级黄色片| 日美女大长腿b| 亚洲性无码av在线| 看全色黄大色黄大片大学生| 国产亚洲美女精品久久| 香蕉国产综合久久猫咪| 天天躁狠狠躁狠狠躁夜夜躁| 久久一日本道色综合久| 最近中文2019字幕第二页| 亚洲欧美日韩久久精品第一区 | 羞羞网站在线观看| 国产成人无码AⅤ片在线观看| 91蜜芽尤物福利在线观看| 少妇高潮无套内谢| 久久久久久久久66精品片| 机机对机机120分免费无遮挡 | 欧美国产综合欧美视频| 人妻va精品va欧美va| 美女视频一区二区三区| 国产好吊妞视频在线观看| 自拍偷拍999| 国内揄拍高清国内精品对白| wwwxxx国产| 成人免费在线看片| 久久99精品久久久久久水蜜桃| 最近中文字幕高清中文字幕电影二| 亚洲欧美一区二区三区在线| 狠狠色婷婷久久一区二区三区 | aaaa级少妇高潮大片在线观看|