目錄
一、斷言概述
二、基本用法
三、工作原理
四、斷言的優點
五、啟用和禁用斷言
六、性能考慮
七、最佳實踐
八、示例代碼
一、斷言概述
? ? assert.h
?頭文件定義了宏?assert()
,用于在運行時驗證程序是否符合指定條件。如果條件不滿足,程序會報錯并終止運行。這種機制被稱為"斷言"(assertion),是程序開發中常用的調試工具。
二、基本用法
assert(p != NULL);
????????上述代碼會在程序執行到該行時,驗證變量?p
?是否不等于?NULL
。如果條件為真,程序繼續執行;如果為假,程序會終止并輸出錯誤信息。
三、工作原理
assert()
?宏接受一個表達式作為參數:
-
當表達式為真(返回值非零)時,
assert()
?不產生任何作用 -
當表達式為假(返回值為零)時,
assert()
?會:-
向標準錯誤流?
stderr
?寫入錯誤信息 -
顯示未通過的表達式
-
顯示包含該表達式的文件名和行號
-
調用?
abort()
?終止程序執行
-
四、斷言的優點
-
自動診斷:自動標識問題所在的文件和行號,便于快速定位錯誤
-
靈活啟用/禁用:通過定義?
NDEBUG
?宏可以全局啟用或禁用斷言 -
文檔作用:斷言可以充當代碼注釋,明確表達程序員的預期
-
防御性編程:幫助在開發階段捕獲非法條件和邏輯錯誤
五、啟用和禁用斷言
在?#include <assert.h>
?之前定義?NDEBUG
?宏可以禁用所有斷言:
#define NDEBUG
#include <assert.h>
????????這樣編譯器會忽略文件中的所有?assert()
?語句。如需重新啟用斷言,只需移除或注釋掉?NDEBUG
?的定義。
六、性能考慮
斷言的缺點是會引入額外的運行時檢查,可能影響程序性能。因此:
-
Debug 版本:建議啟用斷言,幫助開發者發現問題
-
Release 版本:通常禁用斷言以提高性能
在 Visual Studio 等集成開發環境中,Release 版本會自動優化掉斷言代碼。
七、最佳實踐
-
使用斷言檢查不應發生的條件,而不是預期的錯誤情況
-
不要用斷言替代正常的錯誤處理
-
斷言表達式不應有副作用(如修改變量值)
-
在關鍵算法和復雜邏輯處添加斷言
-
為函數的前置條件和后置條件添加斷言
八、示例代碼
#include <stdio.h>
#include <assert.h>int divide(int a, int b) {assert(b != 0 && "Divide by zero"); // 檢查除數不為零return a / b;
}int main() {printf("10/2 = %d\n", divide(10, 2));printf("10/0 = %d\n", divide(10, 0)); // 會觸發斷言失敗return 0;
}
當斷言失敗時,程序會輸出類似以下信息: