C++11筆記:靜態(tài)斷言

斷言(assert)

斷言(assert)是一種編程中常用的手段坐搔。斷言就是將一個返回值總需要為真的判別式放在語句中,用于排除在設(shè)計的邏輯上不該產(chǎn)生的情況。請看如下代碼:

void assert_test(int i) {
    cout << "Before assert, i is " << i << endl;
    assert(i > 0);
    cout << "After assert." << endl;
}

上述代碼期望函數(shù)的參數(shù)總是大于0,如果小于等于0弓摘,則(i > 0)不成立,當(dāng)傳入?yún)?shù)為-1的時候看到以下結(jié)果:

assert_ret.png

在C++中痕届,可以使用NDEBUG宏可以禁用assert宏韧献,上述代碼在編譯過程中加入“-DNDEBUG”參數(shù)末患,則執(zhí)行上述代碼結(jié)果如下:

??
assert_NDEBUG.png

可以看到并未出錯。在用戶使用場景中锤窑,發(fā)送錯誤導(dǎo)致程序退出對用戶來說總是不友好的璧针,在某些錯誤即使發(fā)生也不會影響其他的功能,但在開發(fā)過程中找到錯誤則是必要的果复。所以在Debug版程序中需要使用assert陈莽,而Release版則可以添加-DNDEBUG宏來關(guān)閉assert。

#error

從上述可知assert是在運(yùn)行階段判斷是否有錯誤虽抄,編譯器也為我們提供來在編譯預(yù)處理階段進(jìn)行斷言操作的方法走搁,即#error。請看如下代碼:

#ifndef STATIC_ASSERT_DEMO_H
#error          "Please include static_assert_demo head file."
#endif

上述代碼表示迈窟,如果沒有include頭文件“static_assert_demo.h”私植,則不會定義STATIC_ASSERT_DEMO_H宏,則在編譯預(yù)處理階段就會打印#error所示的錯誤车酣,編譯上述代碼結(jié)果如下:

??
error_ret.png

在包含相應(yīng)的頭文件后曲稼,則編譯沒有錯誤。
通過#error湖员,可以結(jié)合#if和#endif贫悄,在預(yù)處理階段進(jìn)行斷言判斷。

靜態(tài)斷言(static_assert)

assert在運(yùn)行時才能起作用娘摔,#errror在預(yù)處理階段起作用窄坦。有時我們希望在編譯過程中做一些斷言,C++11中因此引入了靜態(tài)斷言(static_assert)操作凳寺。
static_assert有兩個參數(shù)鸭津,分別為一個斷言表達(dá)式,一個為警告信息(字符串)肠缨。請看如下代碼:

void static_assert_test() {
    static_assert(sizeof(long int) == 4, "The software is not suitable for 64-bit machines.");
}

上述代碼表示如果不在32位機(jī)器(long int長度為4)上編譯逆趋,則會報錯。編譯上述代碼結(jié)果如下:

??
static_assert_ret.png

通過靜態(tài)斷言機(jī)制晒奕,在編譯過程中可以排除代碼中一些隱藏的錯誤闻书。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市脑慧,隨后出現(xiàn)的幾起案子惠窄,更是在濱河造成了極大的恐慌,老刑警劉巖漾橙,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異楞卡,居然都是意外死亡霜运,警方通過查閱死者的電腦和手機(jī)脾歇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淘捡,“玉大人藕各,你說我怎么就攤上這事〗钩” “怎么了激况?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長膘魄。 經(jīng)常有香客問我乌逐,道長,這世上最難降的妖魔是什么创葡? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任浙踢,我火速辦了婚禮,結(jié)果婚禮上灿渴,老公的妹妹穿的比我還像新娘洛波。我一直安慰自己,他們只是感情好骚露,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布蹬挤。 她就那樣靜靜地躺著,像睡著了一般棘幸。 火紅的嫁衣襯著肌膚如雪焰扳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天够话,我揣著相機(jī)與錄音蓝翰,去河邊找鬼。 笑死女嘲,一個胖子當(dāng)著我的面吹牛畜份,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播欣尼,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼愕鼓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起菇晃,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎磺送,沒想到半個月后驻子,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灿意,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡崇呵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了域慷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荒辕。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖犹褒,靈堂內(nèi)的尸體忽然破棺而出抵窒,到底是詐尸還是另有隱情,我是刑警寧澤化漆,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站疙赠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏圃阳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一捍岳、第九天 我趴在偏房一處隱蔽的房頂上張望睬隶。 院中可真熱鬧锣夹,春花似錦苏潜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽飞袋。三九已至,卻和暖如春巧鸭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工芯肤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留压鉴,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓油吭,卻偏偏與公主長得像署拟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子推穷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

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

  • 簡介 C++98/03的設(shè)計目標(biāo):一、比C語言更適合系統(tǒng)編程(且與C語言兼容)馒铃。二、支持?jǐn)?shù)據(jù)抽象区宇。三、支持面向?qū)ο?..
    認(rèn)真學(xué)計算機(jī)閱讀 5,325評論 0 53
  • 花褪殘紅青杏小,燕子飛時,綠水人家繞炉爆。枝上柳綿吹又少,天涯何處無芳草。 墻里秋千墻外道,墻外行人,墻里佳人笑卧晓。笑漸...
    丁丁的電腦閱讀 300評論 0 0
  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,788評論 0 38
  • 一個人,拋下一切獨(dú)自上路波附,這種感覺,久違了掸屡。 帶著期許,對風(fēng)景的執(zhí)著仅财,也是對生活的偷懶,結(jié)識生命里的緣分盏求,或許這就...
    敢說真話的妖精閱讀 233評論 1 5
  • 周五下午下班時亿眠,妻打來電話說磅废,晚上想看場電影纳像,問我能否陪她去拯勉。 早答應(yīng)陪妻去看場電影的竟趾,一直沒能兌現(xiàn)宫峦。這次正好有時...
    山高人為峰1閱讀 447評論 0 5