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

            O(1) 的小樂

            Job Hunting

            公告

            記錄我的生活和工作。。。
            <2010年9月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            統(tǒng)計

            • 隨筆 - 182
            • 文章 - 1
            • 評論 - 41
            • 引用 - 0

            留言簿(10)

            隨筆分類(70)

            隨筆檔案(182)

            文章檔案(1)

            如影隨形

            搜索

            •  

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            assert斷言

                  ssert是只有定義了DEBUG才起作用的宏,如果其參數(shù)的計算結果為假,就中止調用程序的執(zhí)行。

                assert餅不是一個倉促拼湊起來的宏,為了不在程序的release和debug版本之間引起重要的差別,需要對其進行仔細的定義。宏assert不應該弄亂內存,不應該對未初始化的數(shù)據(jù)進行初始化,即它不應該產(chǎn)生其他副作用。正因為要求程序的debug版本和release版本行為完全相同,所以才不把assert作為函數(shù),而把它做成宏。如果把assert做成函數(shù)的話,其調用就會引起不期望的內存或代碼的兌換。要記住,使用assert的程序員是把它看成一個在任意系統(tǒng)狀態(tài)下都可以安全使用的無害檢測手段。

               在同錯誤進行斗爭時,每一點幫助都會有助于錯誤的發(fā)現(xiàn)。我們?yōu)槭裁匆切┳约簭膩矶加貌恢撵`活性呢?

            #include <crtdefs.h>

            #undef  assert

            #ifdef  NDEBUG

            #define assert(_Expression)     ((void)0)

            #else

            #ifdef  __cplusplus
            extern "C" {
            #endif

            _CRTIMP void __cdecl _wassert(_In_z_ const wchar_t * _Message, _In_z_ const wchar_t *_File, _In_ unsigned _Line);

            #ifdef  __cplusplus
            }
            #endif

            #define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )

            #endif  /* NDEBUG */

            以上為我的VS2008里面assert.h

              當assert失敗時,他就會使用預處理程序根據(jù)宏_FILE_  _LINE_所提供的文件名和行號調用_wassert   _wassert在標準錯誤輸出設備stderr上打印一條錯誤信息,然后中止:

               void _wassert(char * strFile , unsigned uLine)

            {

                fflush(stdout);

                fprintf(stderr,”\nAssertion failed : %s,line %u\n”,srFile, uLIne);

               fflush(stderr);

               abort();

            }

               在執(zhí)行abort之前,需要調用fflush將所有的緩沖輸出寫到標準輸出設備stdout上。同樣,如果stdout 和stderr 都將指向同一設備,fflush stdout仍然要放在fflush stderr之前,以確保只有在所有的輸出都送到了stdout之后,fprintf才顯示相應的錯誤信息。

               不管斷言宏最終是用什么樣子方法定義的,都要使用它來對傳遞給相應函數(shù)的參數(shù)進行確認。如果在函數(shù)的每個調用點都對其進行參數(shù)進行檢查,錯誤很快就會被發(fā)現(xiàn)。斷言宏最好作用是使用戶在錯誤發(fā)生時,就可以自動地把他們檢查出來。

             

             

            此外關于斷言,也有兩篇不錯的文章

            http://blog.csdn.net/donghai51arm/archive/2009/11/28/4897004.aspx

            http://dev.firnow.com/course/3_program/c++/cppsl/200861/118777.html

            posted on 2010-09-02 21:18 Sosi 閱讀(829) 評論(0)  編輯 收藏 引用

            統(tǒng)計系統(tǒng)
            亚洲一区二区三区日本久久九| 久久久久亚洲精品天堂久久久久久| 久久午夜无码鲁丝片午夜精品| 精品久久人人妻人人做精品| 少妇被又大又粗又爽毛片久久黑人| 伊人久久五月天| 91精品国产综合久久久久久| 国产精品99久久精品爆乳| 2021国产精品午夜久久| 国产精品九九九久久九九 | 久久夜色精品国产亚洲| 精品久久无码中文字幕| 香蕉久久永久视频| 996久久国产精品线观看| 日本亚洲色大成网站WWW久久| 国内精品久久久人妻中文字幕| 久久AⅤ人妻少妇嫩草影院| 九九精品99久久久香蕉| 久久午夜夜伦鲁鲁片免费无码影视| 久久国产成人精品麻豆| 国产成人精品综合久久久久| 久久亚洲高清综合| 国产精品99久久不卡| 成人免费网站久久久| 亚洲级αV无码毛片久久精品| 久久www免费人成精品香蕉| 久久精品嫩草影院| 久久久久人妻一区二区三区vr| 香港aa三级久久三级老师2021国产三级精品三级在 | 久久久久久久久波多野高潮| 国产高潮久久免费观看| 99久久国产综合精品麻豆| 狠狠色丁香久久婷婷综合五月| 97精品国产97久久久久久免费| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 久久这里有精品视频| 久久久精品日本一区二区三区| 91久久香蕉国产熟女线看| 夜夜亚洲天天久久| 久久九色综合九色99伊人| 久久久久久国产精品免费免费|