文件名:
<cassert> (assert.h)
這是一個C語言的診斷庫,assert.h文件中定義了一個可作為標准調試工具的宏函數: assert ;
下面介紹這個宏函數:assert
函數原型:
void assert (int expression);
函數描述:
如果這個宏函數形式的參數(expression)等於零,也就是說參數的表達式等價於false,那麼就會有一條消息會被寫入到標准錯誤設備,並且調用abort()函數來終止程序的運行;
這條特殊消息的顯示依賴於特定庫的實現,但是至少包括: 錯誤參數的陳述,源文件的名稱,發生錯誤的行號;
通常的表達形式是: Assertion failed: 參數 文件名 行號 ;
這個宏定義無法使用if,因為在你敲上 #include <assert.h> 的那一刻,一個名為NDEBUG的宏定義就已被聲明了,這意味著當調試程序的時候程序員可以按照需要敲許多 assert() 在代碼中,並且在發布release版本時只需要簡單的在代碼的開頭處並要在 <assert.h> 之前敲上
#define NDEBUG
就可以禁止全部 assert 的作用;
因此,這個宏定義是被設計來捕捉編程中的錯誤,而不是用戶或運行時錯誤,因為它通常在程序調試完成後會被禁止.
函數參數:
int expression
expression可以是一個待計算的表達式,如果表達式的運算結果是0,這將導致斷言失敗(assertion failure)並終止程序;
函數返回值:
void
示例:
1 /* assert example */ 2 #include <stdio.h> /* printf */ 3 #include <assert.h> /* assert */ 4 5 void print_number(int* myInt) { 6 assert (myInt!=NULL); 7 printf ("%d\n",*myInt); 8 } 9 10 int main () 11 { 12 int a=10; 13 int * b = NULL; 14 int * c = NULL; 15 16 b=&a; 17 18 print_number (b); 19 print_number (c); 20 21 return 0;
在這個栗子中,在程序運行時當 print_number(int *) 函數傳入了一個空指針作為實參,assert就會終止它.這發生在第二次調用 print_number(int *) 的時候,這時會引發一個斷言失敗(assertion failure)來標記(signal)這個BUG;