assert 實現分析

2022-05-26 14:48:10 字數 1057 閱讀 3402

一直以來,對於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 函式來終止...