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ò)信息,然后通過(guò)調(diào)用abort來(lái)終止程序運(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來(lái)禁用assert調(diào)用。(不過(guò)只有assert只在debug版本才能生效,發(fā)行版本都是release版。)
靜態(tài)斷言 static_assert
現(xiàn)行許多編譯器不支持,略過(guò)。
斷言用法總結(jié)與注意事項(xiàng):
- 在函數(shù)開始處校檢傳入?yún)?shù)的合法性
assert(nSize >= 0);
- 每個(gè)assert只校檢一個(gè)條件,因?yàn)橥瑫r(shí)校檢多個(gè)條件時(shí),如果斷言失敗,無(wú)法直觀判斷是哪個(gè)條件失?。?/li>
assert(nSize >= 0);
assert(nSize <= MaxSize);
- 不能使用改變環(huán)境的語(yǔ)句,因?yàn)閍ssert只在DEBUG中生效,如果這么做,會(huì)使程序真正運(yùn)行時(shí)遇到問(wèn)題:
錯(cuò)誤:
assert(i++ < 100);
正確:
assert(i < 100);
i++;
- assert和后面的語(yǔ)句應(yīng)空一行,力求規(guī)范
- 注意,assert有時(shí)候并不能替代條件過(guò)濾。