編譯時斷言和執行時斷言
通常為了檢測一些條件,我們往往在程式裡面加斷言。一般只在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...