文件名:
<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;