執行期斷言和編譯期斷言

2021-05-02 19:03:57 字數 1314 閱讀 3509

編譯時斷言和執行時斷言

通常為了檢測一些條件,我們往往在程式裡面加斷言。一般只在debug版有效,release版斷言不生成任何**。c++可以使用兩種斷言: 靜態斷言和動態斷言,即就是執行期斷言和編譯期斷言!顧名思義,執行期斷言是在程式執行過程中判斷指定的條件,若條件滿足,萬事ok,若斷言失敗,則程式給出提示然後被abort掉;編譯期斷言是在編譯時候檢查條件是否滿足,不滿足情況下,編譯器給出錯誤提示(需要人為實現),只要條件不成立,程式是編譯不過的。靜態斷言,boost庫有實現(boost/static_assert.hpp),主要原理就是根據"sizeof(不完整型別)"會報錯。動態斷言在cassert庫檔案有實現。實現如下:

動態斷言:(cassert)

#ifdef ndebug

// 不做任何處理

#  define assert(expr)   

#else

// __assert_failed 列印錯誤訊息(包含表示式串,檔案,所在行,所在函式名),然後abort()。

#  define assert(expr)  ((expr) ? 0 : __assert_failed(__string(expr),  __file__,  __line__, __pretty_function__, 0))  

#endif

靜態斷言:(boost/static_assert.hpp)

template struct static_assertion_failure;

template <> struct static_assertion_failure; };

templatestruct static_assert_test{};

#define boost_static_assert( b ) /

typedef ::boost::static_assert_testsizeof(::boost::static_assertion_failure< (bool) (b) >)

>  boost_static_assert_typedef_

// 當b為false時,sizeof(static_assertion_failure),static_assertion_failure)沒有實現(不能例項化),為不完整類,編譯器報錯!

注意:和動態斷言不同的是,靜態斷言可以在命名空間,類,函式,模板(函式模板和類模板)中使用,因為他用的是typedef。

靜態斷言的詳細用法,檢視:

Go 語言編譯期斷言

這篇文章是關於乙個鮮為人知的讓 go 在編譯期斷言的方法。你可能不會使用它,但是了解一下也很有趣。作為乙個熱身,來看乙個在 go 中熟知的編譯期斷言 介面滿意度檢查。在這段 playground 中,var 行確保型別w是乙個stringwriter,其由io.writestring檢查。packa...

編譯期與執行期

編譯期確切地說應該是得到obj檔案的過程,得到最後可執行檔案的過程叫鏈結 編譯期最前,最後的是執行期。編譯期錯誤是編譯期間就能被編譯器捕捉到的錯誤,譬如定義乙個過大陣列,不過最常見的還是語法錯誤或者拼寫錯誤。執行期錯誤可以也可以是分配乙個過大的陣列,不過在c 裡面這個可以因為new或者malloc產...

編譯時斷言

執行時斷言大家都用過,但如果想當某個條件不滿足時在編譯時就讓程式編譯不通過,即編譯時斷言 不能產生 是什麼樣子的呢。可參考如下 1,參考linux核心靜態斷言 force a compilation error if condition is true ifdef win32 define buil...