• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            隨心動(dòng)

            (轉(zhuǎn))ASSERT與VERIFY宏的區(qū)別

            原文地址:http://blog.csdn.net/liuchanghe/article/details/1425080

            http://blog.vckbase.com/smileonce/articles/1184.html
            (這個(gè)鏈接->關(guān)于Debug和Release之本質(zhì)區(qū)別

            今天公司有同事問(wèn)我ASSERT與VERIFY宏有什么區(qū)別,雖然平時(shí)常用這兩個(gè)宏對(duì)一些變量在Debug模式下作判斷,但一時(shí)還真答不上來(lái)二者之間的具體差別,看來(lái)只是知其然不知其所以然。后來(lái)查了一些資料,總算弄清楚了二者之間的區(qū)別,整理后與同事交流了一番,感覺(jué)收獲還是蠻大的。下面對(duì)我的理解進(jìn)行了總結(jié):

                1 ASSERT與VERIFY宏在Debug模式下作用基本一致,二者都對(duì)表達(dá)式的值進(jìn)行計(jì)算,如果值為非0,則什么事也不做;如果值為0,則輸出診斷信息。
                2 ASSERT與VERIFY宏在Release模式下效果完全不一樣。ASSERT不計(jì)算表達(dá)式的值,也不會(huì)輸出診斷信息;VERIFY計(jì)算表達(dá)式的值,但不管值為0還是非0都不會(huì)輸出診斷信息。
            VERIFY   與ASSERT用在程序調(diào)試上并無(wú)本質(zhì)上的區(qū)別。  
              In   the   debug   version   of   MFC,   the   VERIFY   macro   evaluates   its   argument.   If   the   result   is   0,    
              the   macro   prints   a   diagnostic   message   and   halts   the   program.   If   the   condition   is   nonzero,    
              it   does   nothing.  
               
              In   the   release   version   of   MFC,   VERIFY   evaluates   the   expression   but   does   not   print   or   interrupt   the   program.   For   example,   if   the   expression   is   a   function   call,   the   call   will   be   made.  
            斷言類(lèi)型  定義
            ANSI C 斷言 void assert(int expression );
            C Runtime Lib 斷言 _ASSERT( booleanExpression );
            _ASSERTE( booleanExpression );
            MFC 斷言 ASSERT( booleanExpression );
            VERIFY( booleanExpression );
            ASSERT_VALID( pObject );
            ASSERT_KINDOF( classname, pobject );
            ATL 斷言 ATLASSERT( booleanExpression );
             此外,TRACE() 宏的編譯也受 _DEBUG 控制。
             所有這些斷言都只在 Debug版中才被編譯,而在 Release 版中被忽略。唯一的例外是 VERIFY() 。事實(shí)上,這些宏都是調(diào)用了 assert() 函數(shù),只不過(guò)附加了一些與庫(kù)有關(guān)的調(diào)試代碼。如果你在這些宏中加入了任何程序代碼,而不只是布爾表達(dá)式(例如賦值、能改變變量值的函數(shù)調(diào)用 等),那么 Release 版都不會(huì)執(zhí)行這些操作,從而造成錯(cuò)誤。初學(xué)者很容易犯這類(lèi)錯(cuò)誤,查找的方法也很簡(jiǎn)單,因?yàn)檫@些宏都已在上面列出,只要利用 VC++ 的 Find in Files 功能在工程所有文件中找到用這些宏的地方再一一檢查即可。另外,有些高手可能還會(huì)加入 #ifdef _DEBUG 之類(lèi)的條件編譯,也要注意一下。
             順便值得一提的是 VERIFY() 宏,這個(gè)宏允許你將程序代碼放在布爾表達(dá)式里。這個(gè)宏通常用來(lái)檢查 Windows API 的返回值。有些人可能為這個(gè)原因而濫用 VERIFY() ,事實(shí)上這是危險(xiǎn)的,因?yàn)?VERIFY() 違反了斷言的思想,不能使程序代碼和調(diào)試代碼完全分離,最終可能會(huì)帶來(lái)很多麻煩。因此,專(zhuān)家們建議盡量少用這個(gè)宏

            posted on 2012-07-17 23:38 陳志遠(yuǎn) 閱讀(479) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            導(dǎo)航

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            統(tǒng)計(jì)

            常用鏈接

            留言簿

            隨筆檔案

            文章分類(lèi)

            Othor's blog

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久综合久久久| 亚洲一区中文字幕久久| 久久婷婷五月综合国产尤物app| 日韩美女18网站久久精品| 亚洲va中文字幕无码久久| 久久精品国产免费| 性高湖久久久久久久久AAAAA| 婷婷五月深深久久精品| 国产综合精品久久亚洲| 欧美日韩精品久久免费| 国产国产成人精品久久| 亚洲精品第一综合99久久| 久久精品99久久香蕉国产色戒| 精品国产综合区久久久久久 | 国产亚洲成人久久| 久久久久久伊人高潮影院 | 91精品国产91久久| 久久久久久久久久久| 91精品日韩人妻无码久久不卡| 久久久久亚洲AV成人网人人网站| 亚洲嫩草影院久久精品| 国产精品99久久99久久久| 色天使久久综合网天天| 久久精品亚洲男人的天堂| 欧美久久综合性欧美| 久久精品无码专区免费东京热| 青春久久| 一本久久a久久精品综合香蕉| 99久久亚洲综合精品网站| A狠狠久久蜜臀婷色中文网| 亚洲日本va中文字幕久久| 久久久无码精品亚洲日韩京东传媒 | 欧美亚洲日本久久精品| 国产精品热久久毛片| 国产日韩久久久精品影院首页| 国产精品久久午夜夜伦鲁鲁| 久久婷婷国产综合精品| 久久精品午夜一区二区福利| 久久99精品久久久久久hb无码| 久久亚洲私人国产精品vA| 久久夜色精品国产噜噜麻豆|