欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Assert(斷言實(shí)現(xiàn)機(jī)制深入剖析)

 更新時(shí)間:2013年09月13日 10:29:47   作者:  
言前后最好空一格[編程風(fēng)格的問題,按你自已的喜好,適合自已就最好]。斷言只是用來檢查程序的邏輯正確性,不能代替條件替換。斷言比printf語句這種形式的打印好使

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

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

復(fù)制代碼 代碼如下:

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是通過判斷其參數(shù)的真假來標(biāo)識(shí)程序的邏輯錯(cuò)誤,調(diào)試結(jié)束后可以通過定義NDEBUG來關(guān)閉assert斷言。

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

復(fù)制代碼 代碼如下:

#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 */


解釋:
復(fù)制代碼 代碼如下:

  #ifdef NDEBUG
      #define assert(_Expression)  ((void)0)//當(dāng)調(diào)試完成后,如果定義了NDEBUG,關(guān)閉斷言,優(yōu)化生成的代碼

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

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

有興趣的可以在assert.c中看到其實(shí)現(xiàn),函數(shù)先要把錯(cuò)誤的報(bào)告模式以及程序的類型(控制臺(tái)程序還是GUI程序)決定assert是向標(biāo)準(zhǔn)錯(cuò)誤輸出打印還是以消息框形式出現(xiàn),最后調(diào)用了abort()函數(shù)來終止程序的運(yùn)行。 對(duì)于extern “C” 有時(shí)間再解釋

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

復(fù)制代碼 代碼如下:

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

解釋_Expresssion若為false,則!false=true,!true=false,此時(shí)繼續(xù)執(zhí)行||以后的語句,故會(huì)打印出出錯(cuò)信息,終止程序,若_Expression為true,則!true=false,!false=true,此時(shí)不再執(zhí)行||以后的語句,故不會(huì)打印出信息。

值得注意的是,里面有一個(gè)逗號(hào)表達(dá)式,有興趣的可以研究一下,逗號(hào)表達(dá)式如下

復(fù)制代碼 代碼如下:

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

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

Assert斷言在程序的作用

Assert的例子:



解釋:因?yàn)閠mp=0,tmp==1為false,故程序運(yùn)行的時(shí)候傳給assert宏的參數(shù)為false,因此調(diào)用的結(jié)果是先向stderr打印一條出錯(cuò)信息,然后通過調(diào)用 abort 來終止程序運(yùn)行。如果改成tmp=1,則程序完全正常運(yùn)行。 如里在程序中想關(guān)閉assert宏斷言,可以如下defnie NDEBUG

 
你會(huì)發(fā)現(xiàn)即出tmp=0,也不會(huì)再出現(xiàn)斷言信息,解釋請(qǐng)看頂部

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

復(fù)制代碼 代碼如下:

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

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

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

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

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

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

相關(guān)文章

  • C語言詳解實(shí)現(xiàn)字符菱形的方法

    C語言詳解實(shí)現(xiàn)字符菱形的方法

    字符菱形是指給定一個(gè)字符,用它構(gòu)造一個(gè)對(duì)角線長(zhǎng)5個(gè)字符,傾斜放置的菱形。輸入輸入只有一行, 包含一個(gè)字符。輸出該字符構(gòu)成的菱形
    2022-04-04
  • c語言實(shí)現(xiàn)冒泡排序、希爾排序等多種算法示例

    c語言實(shí)現(xiàn)冒泡排序、希爾排序等多種算法示例

    c語言實(shí)現(xiàn)插入排序、冒泡排序、選擇排序、快速排序、堆排序、歸并排序、希爾排序示例,需要的朋友可以參考下
    2014-04-04
  • VC實(shí)現(xiàn)對(duì)話框窗口任意分割

    VC實(shí)現(xiàn)對(duì)話框窗口任意分割

    最近寫MFC的程序,想在對(duì)話框里實(shí)現(xiàn)窗口的任意分割?,F(xiàn)在網(wǎng)絡(luò)資料一大抄,找個(gè)東西實(shí)在麻煩??偹氵@個(gè)很簡(jiǎn)單,很快就搞定了,寫下來做個(gè)筆記。
    2015-06-06
  • kernel劫持modprobe?path內(nèi)容詳解

    kernel劫持modprobe?path內(nèi)容詳解

    這篇文章主要為大家介紹了kernel劫持modprobe?path的內(nèi)容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 使用C++創(chuàng)建多個(gè)IPC機(jī)制的上層接口

    使用C++創(chuàng)建多個(gè)IPC機(jī)制的上層接口

    設(shè)計(jì)一個(gè)上層的IPC接口,這個(gè)接口將在未來封裝底層的通信機(jī)制,這樣的設(shè)計(jì)要求接口足夠抽象,以便于底層實(shí)現(xiàn)的細(xì)節(jié)對(duì)上層用戶透明,本文給大家介紹了如何使用C++創(chuàng)建多個(gè)IPC機(jī)制的上層接口,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • 一文帶你深入了解C++中的類型轉(zhuǎn)換

    一文帶你深入了解C++中的類型轉(zhuǎn)換

    在C語言中,如果賦值運(yùn)算符左右兩側(cè)類型不同,或者形參與實(shí)參類型不匹配,或者返回值類型與接收返回值類型不一致時(shí),就需要發(fā)生類型轉(zhuǎn)化。本文主要介紹了C++中常見的四個(gè)類型轉(zhuǎn)換,需要的可以參考一下
    2022-12-12
  • C語言實(shí)現(xiàn)二叉樹的基本操作

    C語言實(shí)現(xiàn)二叉樹的基本操作

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)二叉樹的基本操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • QString的常用方法(小結(jié))

    QString的常用方法(小結(jié))

    這篇文章主要介紹了QString的常用方法(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 深入理解c++20 concepts

    深入理解c++20 concepts

    本文主要介紹了深入理解c++20 concepts,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • C++中memcpy和memmove的區(qū)別總結(jié)

    C++中memcpy和memmove的區(qū)別總結(jié)

    這篇文章主要介紹了C++中memcpy和memmove的區(qū)別總結(jié),這個(gè)問題經(jīng)常出現(xiàn)在C++的面試題目中,需要的朋友可以參考下
    2014-10-10

最新評(píng)論