C 程式設計/assert.h
外觀
< C 程式設計
assert.h 定義了宏 assert。這個宏可以用來驗證程式中所做的假設,並在假設不成立時輸出診斷資訊。
執行時,如果表示式為假(即與 0 相等),assert 會將有關失敗呼叫的資訊寫入 stderr,然後呼叫 abort()。它寫入 stderr 的資訊包括:
- 原始檔名(預定義宏
__FILE__) - 源行號(預定義宏
__LINE__) - 源函式(預定義識別符號
__func__)(在 C99 中新增) - 評估為 0 的表示式的文字
使用 gcc 在 Linux 上編譯的程式的示例輸出
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 測試的表示式為假,它將列印除錯資訊。
- : 驗證程式斷言 – 基礎定義參考,單一 UNIX® 規範,第 7 版,來自開放組