跳至內容

assert.h

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

assert.hC標準函式庫中的標頭檔。其中定義了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;
}