assert.h
![本頁使用了標題或全文手工轉換](http://images.weserv.nl/?url=//upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
C標準函式庫 |
---|
一般 |
雜項 |
assert.h
是C標準函數庫中的標頭檔。其中定義了assert()
巨集用於程式除錯。
在C標準函數庫中,它是個非常特別的標頭檔,你可以將它引入數次以獲得不同的效果,此效果依引入時是否以定義NDEBUG而定。
巨集
assert()
是一個診斷巨集,用於動態辨識程式的邏輯錯誤條件。其原型是:
void assert(int expression);
如果巨集的參數求值結果為非零值,則不做任何操作(no action);如果是零值,用寬字元列印診斷訊息,然後呼叫abort()
。診斷訊息包括:
- 原始檔名字(在
stdlib.h
中聲明的巨集__FILE__
的值) - 所在的原始檔的行號(在
stdlib.h
中聲明的巨集__LINE__
的值) - 所在的函數名(在stdlib.h中聲明的巨集
__func__
的值),這是C99新增的特性 - 求值結果為0的表達式
診斷資訊的顯示目標依賴於被呼叫程式的類型。如果是控制台程式,診斷資訊顯示在stderr裝置;如果是基於窗口的程式,assert()
產生一個Windows MessageBox來顯示診斷資訊。
程式可以封鎖掉所有的assert()
而無需修改原始碼。這只需要在命令列呼叫C語言的編譯器時添加巨集定義的命令列選項,定義NDEBUG
巨集;也可以在源程式程式引入<assert.h>
之前就使用#define NDEBUG
來定義巨集。被封鎖的assert()
甚至不對傳遞給它的參數列達式求值,因此使用assert()
時其參數列達式不能有副作用(side-effects)。
常式
#include <stdio.h>
#include <assert.h>
int main (void)
{
FILE *fd;
fd = fopen ("/home/user/file.txt", "r");
assert (fd);
fclose (fd);
return 0;
}