C11編譯時斷言static assert

2022-09-19 22:06:22 字數 1654 閱讀 5929

c++11標準新引入的static_assert功能可以實現靜態斷言,是乙個非常強大的模板元程式設計工具,配合sfinae特性可以在編譯期發現不符合預期的不合理特化,並且給出自定義的錯誤資訊。

1. _static_assert是 c11 中引入的關鍵字。static_assert是 c11 中引入的巨集,它對映到_static_assert關鍵字。它們可用於全域性或函式範圍。

2._assert_wassert函式在執行時測試軟體斷言,並產生執行時成本

3. static_assert關鍵字,用來做編譯期間的斷言,因此叫做靜態斷言。

語法: static_assert(常量表示式,提示字串)。

引數描述: 如果第乙個引數常量表示式的值為false,會產生一條編譯錯誤,錯誤位置就是該static_assert語句所在行,

第二個引數就是錯誤提示字串。

作用:使用static_assert,我們可以在編譯期間發現更多的錯誤,用編譯器來強制保證一些契約,並幫助我們改善編譯資訊的可讀性,尤其是用於模板的時候。

static_assert可以用在全域性作用域中,命名空間中,類作用域中,函式作用域中,幾乎可以不受限制的使用。

編譯器在遇到乙個static_assert語句時,通常立刻將其第乙個引數作為常量表示式進行演算,

但如果該常量表示式依賴於某些模板引數,則延遲到模板例項化時再進行演算,這就讓檢查模板引數成為了可能。

由於是static_assert編譯期間斷言,不生成目標**,因此static_assert不會造成任何執行期效能損失。

C 11 靜態斷言static assert

一 assert 在c 中,或中提供了assert巨集 執行期斷言 可以定義ndebug來禁用assert巨集。二 static asser c 11 靜態斷言static assert,編譯期斷言。static assert 常量表示式,提示字串 兩個引數,乙個是斷言表示式,由於是在編譯期間,所以...

C 11之斷言(影響面廣)

很可笑,我很少用斷言,對斷言的不了解程度與初學者無異。今天翻看了 深入理解c 11 新標準中對斷言做了改進,至少說明斷言還是很有用的。結合 大全 c 應用程式效能優化 把自己對斷言的理解寫下來以方便自己日後用到時查閱。一 為什麼要用斷言 首先要搞清楚為什麼要用斷言,不能看別人 中有,就追趕時髦地用一...

編譯時斷言

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