跳轉到內容

C 程式設計/assert.h

來自華夏公益教科書,開放的書籍,為開放的世界

assert.h 定義了宏 assert。該宏可用於驗證程式所做的假設,並在該假設為假時列印診斷訊息。

在執行時,如果表示式為假(即與 0 相等),assert 將在 stderr 上寫入有關失敗呼叫的資訊,然後呼叫 abort()。它寫入 stderr 的資訊包括

  • 原始檔名(預定義宏 __FILE__
  • 原始碼行號(預定義宏 __LINE__
  • 源函式(預定義識別符號 __func__)(在 C99 中新增)
  • 計算結果為 0 的表示式的文字

在 Linux 上使用 gcc 編譯的程式的示例輸出

program: program.c:5: main: Assertion `a != 1' failed.
Abort (core dumped)

程式設計師可以在不更改原始碼的情況下消除斷言:如果在包含 <assert.h> 之前定義了宏 NDEBUG,則 assert 宏被定義為

#define assert(ignore)((void) 0)

因此對程式沒有影響,甚至不評估其引數。因此,傳遞給 assert 的表示式 不能包含副作用,因為當除錯被停用時它們將不會發生。例如

assert(x = gets());

當除錯被停用時,將不會讀取一行,也不會分配給 x。

C99 標準不要求在 assert.h 標頭檔案中宣告任何函式。

assert 宏的定義取決於宏 NDEBUG 的狀態,該宏 assert.h 標頭檔案中定義。宏 NDEBUG 表示不使用除錯資訊。如果定義了 NDEBUG,則 assert 被定義為一個什麼也不做的表示式。否則,如果 assert 測試的表示式為假,則 assert 將列印除錯資訊。

[編輯 | 編輯原始碼]
  • assert.h: 驗證程式斷言 – 基本定義參考,單一 UNIX® 規範,第 7 版,來自開放組
華夏公益教科書