首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 標準庫 詳解:assert 宏、NDEBUG 控制與自定義實現

     編輯:關於C語言

assert.h 獨特機制

assert.h 可多次包含,效果取決於包含時是否定義 NDEBUG:

  • 未定義 NDEBUG:assert(expr) 為活性斷言,expr==0 時打印診斷信息並 abort()。
  • 已定義 NDEBUG:assert(expr) 展開為空操作(甚至不求值 expr)。

診斷信息包含

  • 源文件名(__FILE__)
  • 行號(__LINE__)
  • 函數名(__func__,C99)
  • 失敗表達式文本

輸出目標:控制台程序 → stderr;GUI 程序 → MessageBox。

使用示例

[cpp]
#include 
#include 

int main() {
    FILE *fd = fopen("/home/user/file.txt", "r");
    assert(fd); // 若 fd==NULL 觸發斷言
    fclose(fd);
    return 0;
}

NDEBUG 效果對比

[cpp]
// 無 NDEBUG
#include 
#include 
int main() {
    printf("1 ok hello\n");
    assert(1==4);
    printf("2 ok exit\n"); // 不會執行
}
// 輸出:1 ok hello → Assertion `1==4' failed → Abort

// 定義 NDEBUG
#define NDEBUG
#include 
#include 
int main() {
    printf("1 ok hello\n");
    assert(1==4); // 被移除
    printf("2 ok exit\n"); // 正常執行
}
// 輸出:1 ok hello → 2 ok exit

assert 宏原理模擬

[cpp]
#define assert(test) if(!(test)) \
    fprintf(stderr, "Assertion failed: %s, file %s, line %d\n", #test, __FILE__, __LINE__), abort()

注意事項

  • 副作用陷阱:assert(x++ > 0) 在 Release 下 x++ 不執行,導致邏輯差異。斷言表達式必須無副作用。
  • 調試專用:不用於生產環境錯誤處理(如文件打開失敗應用 if 判斷返回錯誤碼)。
  • 編譯器命令行:-DNDEBUG (GCC/Clang) 或 /DNDEBUG (MSVC) 可批量禁用斷言。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved