跳至內容

C 程式設計/assert.h

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

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 測試的表示式為假,它將列印除錯資訊。

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