一直以來,對於assert的實現總是不太理解,現在深入assert背後的**,總算對assert的實現有了乙個清醒的認識。
assert基於巨集定義與巨集展開實現。首先介紹一下assert的功能:它能夠斷言給定表示式是否為true。如果為true,則對應assert的**會轉換為static_cast(0)
,即一條空語句,assert不執行任何操作,否則assert對應的**會展開為__assert_fail (__string(expr), __file__, __line__, __func__))
,使用expr引數,源**名,assert所在的行數以及函式名呼叫__assert_fail
函式,輸出錯誤資訊,並且因為斷言出錯而終止程式。請注意,在呼叫函式__assert_fail
時,assert將傳入的引數轉換為字串輸入,這一點只需檢視__string(x)
的定義:#define __string(x) #x
即可明白。
我們知道,在編譯源**的時候,如果我們定義了ndebug
,那麼assert不會起任何作用,哪怕傳入的引數為false
,這是為什麼呢?因為在assert外層還有乙個巨集判斷語句,如果定義了ndebg
,那麼assert語句統一轉換成static_void(0)
進行處理,所以不會對傳入的引數進行任何判斷。
// (為了便於閱讀,**進行了部分修改)
#define __string(x) #x
#ifdef ndebug
# define assert(expr) (static_cast(0))
#else
# define assert(expr) \
((expr) \
?static_cast(0) \
: __assert_fail (__string(expr), __file__, __line__, __func__))
#endif
assert用法分析
我一直以為assert僅僅是個報錯函式,事實上,它居然是個巨集,並且作用並非 報錯 在經過對其進行一定了解之後,對其作用及用法有了一定的了解,assert 的用法像是一種 契約式程式設計 在我的理解中,其表達的意思就是,程式在我的假設條件下,能夠正常良好的運作,其實就相當於乙個if語句 if 假設成...
python中assert用法例項分析
1 assert語句用來宣告某個條件是真的。2 如果你非常確信某個你使用的列表中至少有乙個元素,而你想要檢驗這一點,並且在它非真的時候引發乙個錯誤,那麼assert語句是應用在這種情形下的理www.cppcns.com想語句。3 當as程式設計客棧sert語句失敗的時候,會引發一assertione...
assert的進一步分析
資料結構之assert 本質 接受乙個int型別的引數返回乙個void型別的結果的函式。用法 include void assert exp 若exp 為真,則程式正常繼續執行,為exp 為假,則它先向標準錯誤流stderr列印一條出錯資訊,然後通過呼叫系統函式來終止程式執行 abort 函式來終止...