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