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