C++ 11新特性-靜態(tài)斷言(static_assert)

簡介

C++11中引入了static_assert這個關鍵字,用來做編譯期間的斷言戴卜,因此叫做靜態(tài)斷言逾条。

其語法很簡單:static_assert(常量表達式,提示字符串)投剥。

如果第一個參數(shù)常量表達式的值為真(true或者非零值)师脂,那么static_assert不做任何事情,就像它不存在一樣薇缅,否則會產(chǎn)生一條編譯錯誤危彩,錯誤位置就是該static_assert語句所在行,錯誤提示就是第二個參數(shù)提示字符串泳桦。

說明

使用static_assert汤徽,我們可以在編譯期間發(fā)現(xiàn)更多的錯誤,用編譯器來強制保證一些契約灸撰,并幫助我們改善編譯信息的可讀性谒府,尤其是用于模板的時候。

static_assert可以用在全局作用域中浮毯,命名空間中完疫,類作用域中,函數(shù)作用域中债蓝,幾乎可以不受限制的使用壳鹤。

編譯器在遇到一個static_assert語句時,通常立刻將其第一個參數(shù)作為常量表達式進行演算饰迹,但如果該常量表達式依賴于某些模板參數(shù)芳誓,則延遲到模板實例化時再進行演算,這就讓檢查模板參數(shù)成為了可能啊鸭。

性能方面锹淌,由于是static_assert編譯期間斷言,不生成目標代碼赠制,因此static_assert不會造成任何運行期性能損失赂摆。

范例

比如這段代碼中采用static_assert在編譯階段對相關的配置參數(shù)進行檢查。

bool operator==(const Http2PingFields& a, const Http2PingFields& b) {

? static_assert((sizeof a.opaque_bytes) == Http2PingFields::EncodedSize(),

? ? ? ? ? ? ? ? "Why not the same size?");

? return 0 ==

? ? ? ? std::memcmp(a.opaque_bytes, b.opaque_bytes, sizeof a.opaque_bytes);

}

相關比較

我們知道钟些,C++現(xiàn)有的標準中烟号,就有assert、#error兩個設施政恍,也是用來檢查錯誤的汪拥,還有一些第三方的靜態(tài)斷言實現(xiàn)。

assert是運行期斷言抚垃,它用來發(fā)現(xiàn)運行期間的錯誤,不能提前到編譯期發(fā)現(xiàn)錯誤,也不具有強制性鹤树,也談不上改善編譯信息的可讀性铣焊,既然是運行期檢查,對性能當然是有影響的罕伯,所以經(jīng)常在發(fā)行版本中曲伊,assert都會被關掉;

#error可看做預編譯期斷言追他,甚至都算不上斷言坟募,僅僅能在預編譯時顯示一個錯誤信息,它能做的不多邑狸,可以參與預編譯的條件檢查懈糯,由于它無法獲得編譯信息,當然就做不了更進一步分析了单雾。

那么赚哗,在stastic_assert提交到C++0x標準之前,為了彌補assert#error的不足硅堆,出現(xiàn)了一些第三方解決方案屿储,可以作編譯期的靜態(tài)檢查,例如BOOST_STATIC_ASSERTLOKI_STATIC_CHECK渐逃,但由于它們都是利用了一些編譯器的隱晦特性實現(xiàn)的trick够掠,可移植性、簡便性都不是太好茄菊,還會降低編譯速度疯潭,而且功能也不夠完善,例如BOOST_STATIC_ASSERT就不能定義錯誤提示文字买羞,而LOKI_STATIC_CHECK則要求提示文字滿足C++類型定義的語法袁勺。

參考

https://www.cnblogs.com/lvdongjie/p/4489835.html

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市畜普,隨后出現(xiàn)的幾起案子期丰,更是在濱河造成了極大的恐慌,老刑警劉巖吃挑,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钝荡,死亡現(xiàn)場離奇詭異,居然都是意外死亡舶衬,警方通過查閱死者的電腦和手機埠通,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逛犹,“玉大人端辱,你說我怎么就攤上這事梁剔。” “怎么了舞蔽?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵荣病,是天一觀的道長。 經(jīng)常有香客問我渗柿,道長个盆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任朵栖,我火速辦了婚禮颊亮,結果婚禮上,老公的妹妹穿的比我還像新娘陨溅。我一直安慰自己终惑,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布声登。 她就那樣靜靜地躺著狠鸳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪悯嗓。 梳的紋絲不亂的頭發(fā)上件舵,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音脯厨,去河邊找鬼铅祸。 笑死,一個胖子當著我的面吹牛合武,可吹牛的內(nèi)容都是我干的撕阎。 我是一名探鬼主播痊远,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吹泡,長吁一口氣:“原來是場噩夢啊……” “哼阶剑!你這毒婦竟也來了?” 一聲冷哼從身側響起汤善,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤什猖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后红淡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體不狮,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年在旱,在試婚紗的時候發(fā)現(xiàn)自己被綠了摇零。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡桶蝎,死狀恐怖驻仅,靈堂內(nèi)的尸體忽然破棺而出谅畅,到底是詐尸還是另有隱情,我是刑警寧澤噪服,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布铃彰,位于F島的核電站,受9級特大地震影響芯咧,放射性物質發(fā)生泄漏。R本人自食惡果不足惜竹揍,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一敬飒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芬位,春花似錦无拗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至被饿,卻和暖如春四康,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狭握。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工闪金, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人论颅。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓哎垦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恃疯。 傳聞我的和親對象是個殘疾皇子漏设,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1 文件結構 每個C++/C程序通常分為兩個文件。一個文件用于保存程序的聲明(declaration)今妄,稱為頭文件...
    Mr希靈閱讀 2,870評論 0 13
  • 一蛙奖、什么是assert()潘酗? 編寫代碼時,我們總是會做出一些假設雁仲,斷言(assert)就是用于在代碼中捕捉這些假設...
    學以解憂閱讀 4,495評論 0 0
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學習記錄文檔仔夺,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,754評論 2 9
  • 題目類型 a.C++與C差異(1-18) 1.C和C++中struct有什么區(qū)別攒砖? C沒有Protection行為...
    阿面a閱讀 7,658評論 0 10
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法缸兔,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,222評論 0 2