麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C > 正文

Assert(斷言實現機制深入剖析)

2020-01-26 15:53:00
字體:
來源:轉載
供稿:網友

斷言(assert)的作用是用來判斷程序運行的正確性,確保程序運行的行為與我們理解的一致。其調用形式為assert(logic expression),如果邏輯表達式為假,則調用abort()終止程序的運行。

查看MSDN幫助文檔,可以得到assert的解釋信息如下:

復制代碼 代碼如下:

The ANSI assert macro is typically used to identify logic errors during program development, by implementing the expression argument to evaluate to false only when the program is operating incorrectly. After debugging is complete, assertion checking can be turned off without modifying the source file by defining the identifier NDEBUG. NDEBUG can be defined with a /D command-line option or with a #define directive. If NDEBUG is defined with #define, the directive must appear before ASSERT.H is included.

翻譯過來大概意思就是assert是通過判斷其參數的真假來標識程序的邏輯錯誤,調試結束后可以通過定義NDEBUG來關閉assert斷言。

查看include/assert.h頭文件可以得到assert相關的宏寫義如下:

復制代碼 代碼如下:

#ifdef  NDEBUG

#define assert(exp)     ((void)0)

#else

#ifdef  __cplusplus
extern "C" {
#endif

_CRTIMP void __cdecl _assert(void *, void *, unsigned);

#ifdef  __cplusplus
}
#endif

#define assert(exp) (void)( (exp) || (_assert(#exp, __FILE__, __LINE__), 0) )

#endif  /* NDEBUG */


解釋:
復制代碼 代碼如下:

  #ifdef NDEBUG
      #define assert(_Expression)  ((void)0)//當調試完成后,如果定義了NDEBUG,關閉斷言,優化生成的代碼

接下來的代碼意思是定義如下函數(此函數用于打印出出錯信息):
復制代碼 代碼如下:

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

有興趣的可以在assert.c中看到其實現,函數先要把錯誤的報告模式以及程序的類型(控制臺程序還是GUI程序)決定assert是向標準錯誤輸出打印還是以消息框形式出現,最后調用了abort()函數來終止程序的運行。 對于extern “C” 有時間再解釋

好了,到最后,終于看到了assert的宏定義了

復制代碼 代碼如下:

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

解釋_Expresssion若為false,則!false=true,!true=false,此時繼續執行||以后的語句,故會打印出出錯信息,終止程序,若_Expression為true,則!true=false,!false=true,此時不再執行||以后的語句,故不會打印出信息。

值得注意的是,里面有一個逗號表達式,有興趣的可以研究一下,逗號表達式如下

復制代碼 代碼如下:

(_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0)

asset斷言后返回的結果始終是void(1)/void(0),原因就在于逗號表達式。

Assert斷言在程序的作用

Assert的例子:



解釋:因為tmp=0,tmp==1為false,故程序運行的時候傳給assert宏的參數為false,因此調用的結果是先向stderr打印一條出錯信息,然后通過調用 abort 來終止程序運行。如果改成tmp=1,則程序完全正常運行。 如里在程序中想關閉assert宏斷言,可以如下defnie NDEBUG

 
你會發現即出tmp=0,也不會再出現斷言信息,解釋請看頂部

作用:
1:斷言可以用來檢查傳給函數參數的合法性

復制代碼 代碼如下:

void max(int *a, int n)
{
 assert(a!=null)//利用斷言確保傳給函數的參數不是一個空指針
}

2:一個斷言一般只用來檢查一個條件,便于分析程序【大師寫的<<編程珠璣>>斷言的藝術一個斷言可以&&與||好幾個條件,在我們不是大師之前,還最好不要這樣做~~~】

3: 斷言前后最好空一格[編程風格的問題,按你自已的喜好,適合自已就最好]

4:斷言只是用來檢查程序的邏輯正確性,不能代替條件替換

5:斷言比printf語句這種形式的打印好使~~~~

6:斷言參數可以是函數調用,但是函數返回值要是真假,如assert(sort()),解釋看上面源碼分析

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 黄视频网站免费在线观看 | 免费看操片 | 精品亚洲va在线va天堂资源站 | 欧美日韩国产成人在线观看 | 国产欧美精品一区二区三区四区 | 欧美自拍三区 | 亚洲欧美日韩一区二区三区在线观看 | 久草在线综合 | 一级黄色免费 | 久久精品电影网 | 亚洲电影在线观看高清免费 | 亚洲人成综合第一网 | 91 在线免费观看 | 91精品国产91久久久 | 国产一级aaa全黄毛片 | 国产精品hd免费观看 | 久久久www成人免费精品 | av老司机久久 | 欧美精品在线免费观看 | 欧美一级片一区 | 羞羞视频免费观看入口 | 天天夜碰日日摸日日澡性色av | 91香蕉国产亚洲一区二区三区 | av久草| 国产精品av久久久久久网址 | 爱操影视| 88xx成人永久免费观看 | 一本一道久久久a久久久精品91 | 毛片在哪看| 久久在草 | 欧美日韩爱爱视频 | 毛片a片免费看 | 巨根插入 | 一级黄色毛片免费 | 久久精品国产清自在天天线 | 午夜av男人的天堂 | 国产精品视频亚洲 | 免费观看高清视频网站 | 免费国产视频在线观看 | 黄色伊人网站 | 欧美日韩爱爱视频 |