宏
assert
void assert(int expression);
评估断言
如果这个函数形式的宏的参数表达式等于 0(例如 expression 等于 false),那么编译器会调用 abort 函数来终止程序,并将消息写入标准错误设备。
虽然消息内容依赖于特定的库实现,但是它至少包括:断言失败的 expression ,源文件的名字,和对应的行号。通常格式如下:
Assertion failed: expression, file filename, line line number
参数
expression
expression 会被评估。如果这个 expression 等于 0,则会导致断言失败,并终止程序。
如果在包含 <assert.h> 的时候,一个名为 NDEBUG 的宏已经被定义,那么 assert 宏将被关闭。这个功能使的开发人在调试程序的时候,能在源代码中包含很多 assert 调用,而发布版本的时候能关闭所有 assert 宏,只需要在代码开始部分,并在包含 <assert.h> 前写上这样一行代码:
1. #define NDEBUG
因此,assert 的设计是用来捕捉程序错误的,而不是用户或者运行时错误,在程序退出调试阶段后,通常都会使用 NDEBUG 来关闭这个宏。
返回值
无
例子
1. /* assert example */
2. #include <stdio.h> /* printf */
3. #include <assert.h> /* assert */
5. void print_number(int *myInt)
6. {
7. assert(myInt != NULL);
8. printf("%d\n", *myInt);
9. }
11. int main()
12. {
13. int a = 0;
14. int * b = NULL;
15. int * c = NULL;
17. b = &a;
19. print_number(b);
20. print_number(c);
22. return 0;
23. }
在这个例子中,如果 print_number 使用一个空指针作为参数被调用,那么assert 会终止程序执行。这种情况发生在第二次调用 print_number 时,它触发了一个断言失败,提示了bug的存在。
