您的位置: 旅游網(wǎng) > 綜藝 >> 天天向上

    中用于調(diào)試程序的幾個宏的使用技巧的

    發(fā)布時間:2021-10-28 05:38:38

    一、TRACE宏

    當(dāng)選擇了Debug目標(biāo),并且afxTraceEnabled變量被置為TRUE時,TRACE宏也就隨之被激活了。但在程序的Release版本中,它們是被完全禁止的。下面是一個典型的TRACE語句:

    int nCount =9;

    CString strDesc(\"total\");

    TRACE(\"Count =%d,Description =%s\\n\",nCount,strDesc);

    可以看到,TRACE語句的工作方式有點像C語言中的printf語句,TRACE宏參數(shù)的個數(shù)是可變的,因此使用起來非常容易。如果查看MFC的源代碼,你根本找不到TRACE宏,而只能看到TRACE0、TRACE1、TRACE2和TRACE3宏,它們的參數(shù)分別為0、1、2、3。

    寧夏吉元冶金集團有限公司 二、ASSERT宏

    如果你設(shè)計了一個函數(shù),該函數(shù)需要一個指向文檔對象的指針做參數(shù),但是你卻錯誤地用一個視圖指針調(diào)用了這個函數(shù)。這個假的地址將導(dǎo)致視數(shù)據(jù)的破壞?,F(xiàn)在,這種類型的問題可以被完全避免,只要在該函數(shù)的開始處實現(xiàn)一個ASSERT測試,用來檢測該指針是否真正指向一個文檔對象。一般來講,編程者在每個函數(shù)的開始處均應(yīng)例行公事地使用assertion。ASSERT宏將會判斷表達(dá)式,如果一個表達(dá)式為真,執(zhí)行將繼續(xù),否則,程序?qū)@示一條消息并且暫停,你可以選擇忽視這條錯誤并繼續(xù)、終止這個程序或者是跳到Debug器中。下面一例演示了如何使用一個ASSERT宏去驗證一個語句。

    void foo( char p, int size )

    {

    ASSERT( p != 0 ); //確認(rèn)緩沖區(qū)的指針是有效的

    ASSERT( ( size = 100 ); //確認(rèn)緩沖區(qū)至少有100個字節(jié)

    // Do the foo calculation

    }

    這些語句不產(chǎn)生任何代碼,除非—DEBUG處理器標(biāo)志被設(shè)置。Visual C++只在Debug版本設(shè)置這些標(biāo)志,而在Release版本不定義這些標(biāo)志。當(dāng)—DEBUG被定義時,兩個assertions將產(chǎn)生如下代碼:

    //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循環(huán)將整個assertion封裝在一個單獨的程序塊中,使得編譯器編譯起來很舒暢。If語句將求取表達(dá)式的值并且當(dāng)結(jié)果為零時調(diào)用AfxAssertFailedLine()函數(shù)。這個函數(shù)將彈出一個對話框,其中提供三個選項“取消、重試或忽略”,當(dāng)你選取“重試”時,它將返回TRUE。重試將導(dǎo)致對AfxDebugBreak()函數(shù)的調(diào)用,從而激活調(diào)試器。

    Do-while循環(huán)將整個assertion封裝在一個單獨的程序塊中,使得編譯器編譯起來很舒暢。If語句將求取表達(dá)式的值并且當(dāng)結(jié)果為零時調(diào)用AfxAssertFailedLine()函數(shù)。這個函數(shù)將彈出一個對話框,其中提供三個選項“取消、重試或忽略”,當(dāng)你選取“重試”時,它將返回TRUE。重試將導(dǎo)致對AfxDebugBreak()函數(shù)的調(diào)用,從而激活調(diào)試器。

    AfxAssertFailedLine()是一個未正式公布的函數(shù),它的功能就是顯示一個消息框。該函數(shù)的源代碼駐留在p中。函數(shù)中的—FILE—和—LINE—語句是處理器標(biāo)志,它們分別指定了源文件名和當(dāng)前的行號。

    AfxAssertFailedLine()是一個未正式公布的函數(shù),它的功能就是顯示一個消息框。該函數(shù)的源代碼駐留在p中。函數(shù)中的—FILE—和—LINE—語句是處理器標(biāo)志,它們分別指定了源文件名和當(dāng)前的行號。

    三、VERIFY 宏

    因為assertion只能在程序的Debug版本中起作用,在表達(dá)式中不可以包含賦值語句、增加語句(++)或者是減少語句(--),因為,這些語句實際改變數(shù)據(jù)??捎袝r你可能想要驗證一個能動的表達(dá)式,使用一個賦值語句。那么就到了用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宏仍然測試表達(dá)式而assertion卻不起任何作用。可以說,在Release模式下,ASSERT語句被刪除了。

    請注意,如果你在一個ASSERT語句中錯誤地使用了一個能動的表達(dá)式,編譯器將不做任何警告地忽略它。在Release模式下,該表達(dá)式就會被無聲息地刪除掉,這將會導(dǎo)致程序的錯誤運行。由于Release版的程序通常不包含Debug信息,這類錯誤將很難被發(fā)現(xiàn)。

    查看本文來源

    長沙婦科哪家醫(yī)院好
    石家莊專業(yè)治療牛皮癬醫(yī)院
    昆明包皮包莖治療多少錢
    猜你會喜歡的
    猜你會喜歡的
    主站蜘蛛池模板: 欧美日韩综合一区| 韩国高清色www在线播放| 成年女人a毛片免费视频| 亚洲国产精品网| 精品久久久久香蕉网| 国产在线精品一区二区夜色 | 国产精品午夜在线播放a| 一本大道无香蕉综合在线| 日韩午夜伦y4480私人影院| 亚洲欧美丝袜制服在线| 精品国产粉嫩内射白浆内射双马尾| 国产极品美女高潮无套| 97在线公开视频| 影音先锋亚洲资源| 久久九九久精品国产| 欧美亚洲色综久久精品国产| 免费无码又爽又刺激毛片| 草莓视频成人appios| 国产福利一区二区三区在线视频 | 亚洲国产欧洲综合997久久| 福利在线一区二区| 国产一区二区不卡老阿姨| 亚洲人成网站看在线播放| 大学生一级毛片免费看**| 中文亚洲av片不卡在线观看| 日韩欧美在线综合网高清| 亚洲成av人片高潮喷水| 男女搞基视频软件| 四虎永久在线精品国产免费 | 久久久噜久噜久久gif动图| 在线播放日本爽快片| 一级毛片免费播放试看60分钟| 日韩亚洲av无码一区二区不卡| 亚洲日本香蕉视频| 男和女一起怼怼怼30分钟| 国产60部真实乱| 香蕉视频在线观看网站| 国产精品va在线观看无码| 99久热只有精品视频免费观看17| 成人免费大片免费观看网站| 久久夜色精品国产噜噜麻豆|