Linux 下使用 assert 與 Windows Visual Studio 環境截然不同:必須在編譯命令加入 -DNDEBUG 才會在發布版移除斷言,否則運行時可能因斷言失敗中斷程式。本文詳細說明用法、編譯控制與五大注意事項。
#include
void assert(int expression);
expression,若為假 (0) → 向 stderr 列印錯誤訊息(含檔案、行號、運算式) → 呼叫 abort() 終止程式。NDEBUG 宏時 生效(預設 Debug 建置)。badptr.c#include
#include
#include
int main(void) {
FILE *fp = fopen("test.txt", "w");
assert(fp); // 成功,不會觸發
fclose(fp);
fp = fopen("noexitfile.txt", "r"); // 檔案不存在,fopen 回傳 NULL
assert(fp); // 觸發斷言失敗
fclose(fp); // 永不執行
return 0;
}
$ gcc badptr.c
$ ./a.out
a.out: badptr.c:14: main: Assertion `fp' failed.
Aborted
在 #include 之前 定義 NDEBUG:
#include
#define NDEBUG
#include
/* 之後的 assert 皆會被預處理器移除 */
或編譯時加入 gcc -DNDEBUG badptr.c。
assert 只檢查單一條件,失敗時易定位問題。assert(nNewSize >= 0); assert(nNewSize <= MAX_BUFFER_SIZE);assert(i++ < 100) 錯誤,因 Release 版不執行 i++ 導致邏輯錯誤。應寫成 assert(i < 100); i++;。if 判斷並優雅處理,assert 僅防禦內部邏輯錯誤。掌握 -DNDEBUG 控制與上述守則,即能在 Linux 專案中安全、高效地運用 assert 輔助除錯。