• <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>

            隨心動

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

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

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

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

                1 ASSERT與VERIFY宏在Debug模式下作用基本一致,二者都對表達式的值進行計算,如果值為非0,則什么事也不做;如果值為0,則輸出診斷信息。
                2 ASSERT與VERIFY宏在Release模式下效果完全不一樣。ASSERT不計算表達式的值,也不會輸出診斷信息;VERIFY計算表達式的值,但不管值為0還是非0都不會輸出診斷信息。
            VERIFY   與ASSERT用在程序調(diào)試上并無本質(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.  
            斷言類型  定義
            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() 。事實上,這些宏都是調(diào)用了 assert() 函數(shù),只不過附加了一些與庫有關(guān)的調(diào)試代碼。如果你在這些宏中加入了任何程序代碼,而不只是布爾表達式(例如賦值、能改變變量值的函數(shù)調(diào)用 等),那么 Release 版都不會執(zhí)行這些操作,從而造成錯誤。初學者很容易犯這類錯誤,查找的方法也很簡單,因為這些宏都已在上面列出,只要利用 VC++ 的 Find in Files 功能在工程所有文件中找到用這些宏的地方再一一檢查即可。另外,有些高手可能還會加入 #ifdef _DEBUG 之類的條件編譯,也要注意一下。
             順便值得一提的是 VERIFY() 宏,這個宏允許你將程序代碼放在布爾表達式里。這個宏通常用來檢查 Windows API 的返回值。有些人可能為這個原因而濫用 VERIFY() ,事實上這是危險的,因為 VERIFY() 違反了斷言的思想,不能使程序代碼和調(diào)試代碼完全分離,最終可能會帶來很多麻煩。因此,專家們建議盡量少用這個宏

            posted on 2012-07-17 23:38 陳志遠 閱讀(469) 評論(0)  編輯 收藏 引用


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


            導(dǎo)航

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統(tǒng)計

            常用鏈接

            留言簿

            隨筆檔案

            文章分類

            Othor's blog

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            一本大道加勒比久久综合| 无码日韩人妻精品久久蜜桃| 91精品国产91久久久久福利| 99久久99久久久精品齐齐| 国产精品欧美亚洲韩国日本久久 | 99久久国产综合精品网成人影院| 精品久久久久久成人AV| 国产福利电影一区二区三区,免费久久久久久久精 | 国内精品伊人久久久久妇| 蜜臀av性久久久久蜜臀aⅴ麻豆| 丁香狠狠色婷婷久久综合| 少妇被又大又粗又爽毛片久久黑人| 久久人妻AV中文字幕| 日韩精品国产自在久久现线拍 | 久久精品一区二区| 亚洲国产精品综合久久一线| 久久久久亚洲AV成人片| 久久久久国产| 亚洲一区中文字幕久久| 色欲久久久天天天综合网| 久久久久亚洲爆乳少妇无| 日韩人妻无码精品久久免费一| 久久精品国产99久久丝袜| 久久精品国产亚洲一区二区| 性欧美大战久久久久久久久| 日韩欧美亚洲综合久久影院Ds| 久久综合九色综合精品| 国产精品一区二区久久| 日本人妻丰满熟妇久久久久久| 99久久国产综合精品女同图片| 亚洲日本va午夜中文字幕久久| 久久99精品免费一区二区| 国产精品免费福利久久| 久久香综合精品久久伊人| 色婷婷综合久久久久中文| 久久亚洲国产成人精品性色| 99久久国产综合精品女同图片| 伊人久久大香线蕉综合影院首页| 人妻无码精品久久亚瑟影视| 香蕉久久永久视频| 一本大道久久东京热无码AV|