c++11中静态断言static_assert
c++11中的靜態斷言(static_assert)
在c++11中引入了,目的是在編譯時就能檢查處一些問題。寫法如下:
static_assert(常量表達式,提示字符串);?
如果第一個參數常量表達式的值為真(true或者非零值),那么static_assert不做任何事情,就像它不存在一樣,否則會產生一條編譯錯誤,錯誤位置就是該static_assert語句所在行,錯誤提示就是第二個參數提示字符串。
?
非常簡單的例子如下:
int main () {static_assert(1 != 1, "1 == 1 is true.");return 0; }結果:In function 'int main()': 29:5: error: static assertion failed: 1 == 1 is true.
編譯不通過。
?
優點如下:
1,使用static_assert,我們可以在編譯期間發現更多的錯誤,提前找出錯誤的原因。
2,static_assert可以用在全局作用域中,命名空間中,類作用域中,函數作用域中,幾乎可以不受限制的使用。
3,編譯器在遇到一個static_assert語句時,通常立刻將其第一個參數作為常量表達式進行演算,但如果該常量表達式依賴于某些模板參數,則延遲到模板實例化時再進行演算,這就讓檢查模板參數成為了可能。
4,由于之前有望加入C++0x標準的concepts提案最終被否決了,因此對于檢查模板參數是否符合期望的重任,就要靠static_assert來完成了,所以如何構造適當的常量表達式,將是一個值得探討的話題。
5,性能方面,由于是static_assert編譯期間斷言,不生成目標代碼,因此static_assert不會造成任何運行期性能損失。
在一些開源的代碼中,使用到了靜態斷言,例如:rocksdb、mysql等,其中mysql中的table_helper.cc中的一個函數的例子如下:
void set_field_mdl_type(Field *f, opaque_mdl_type mdl_type) {static_assert(MDL_TYPE_END == 11,"Adjust performance schema when changing enum_mdl_type");// ...// ... }?
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的c++11中静态断言static_assert的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 微信公众开发java教程_[Java教程
- 下一篇: 【Git】Git提交代码详细步骤
