assert 動(dòng)態(tài)斷言
#include <assert.h>
void assert(int expression)
assert的原型定義在 <assert.h>中,其作用是如果它的條件返回錯(cuò)誤幸逆,則終止程序執(zhí)行棍辕。
- C++ assert()函數(shù)的作用是先計(jì)算表達(dá)式expression, 如果其值為假(即為0),那么它先向stderr打印一條出錯(cuò)信息还绘,然后通過調(diào)用abort來終止程序運(yùn)行楚昭。
- assert(fin!=NULL && fout!=NULL); 表示在debug模式下,當(dāng)fin或者fout其中一個(gè)為空時(shí)拍顷,程序就會(huì)被中斷并退出抚太。
- 頻繁調(diào)用其會(huì)增加額外開銷,影響程序性能;在調(diào)試結(jié)束后尿贫,可在包含
#include <assert.h>
的語(yǔ)句之前插入#define NDEBUG
來禁用assert調(diào)用电媳。(不過只有assert只在debug版本才能生效,發(fā)行版本都是release版庆亡。)
靜態(tài)斷言 static_assert
現(xiàn)行許多編譯器不支持匾乓,略過。
斷言用法總結(jié)與注意事項(xiàng):
- 在函數(shù)開始處校檢傳入?yún)?shù)的合法性
assert(nSize >= 0);
- 每個(gè)assert只校檢一個(gè)條件又谋,因?yàn)橥瑫r(shí)校檢多個(gè)條件時(shí)拼缝,如果斷言失敗,無法直觀判斷是哪個(gè)條件失斅Ц:
assert(nSize >= 0);
assert(nSize <= MaxSize);
- 不能使用改變環(huán)境的語(yǔ)句珍促,因?yàn)閍ssert只在DEBUG中生效,如果這么做剩愧,會(huì)使程序真正運(yùn)行時(shí)遇到問題:
錯(cuò)誤:
assert(i++ < 100);
正確:
assert(i < 100);
i++;
- assert和后面的語(yǔ)句應(yīng)空一行猪叙,力求規(guī)范
- 注意,assert有時(shí)候并不能替代條件過濾仁卷。