1. 概述
头文件assert.h的唯一目的是提供宏assert的定义。可以在程序中关键的地方使用这个宏来进行断言。如果一处断言被证明非真,我们希望程序在标准错误流输出一条适当的提示信息,并且使执行异常终止。
但其不是编写产品代码的最好方式,断言只能在调试程序的时候其左作用。可以使用NDEBUG宏来取消断言。
2. Macro(宏定义)
宏 | 定义 | 说明 |
---|---|---|
assert | void assert (int expression); | 宏assert向程序中加入诊断。当执行它的时候,如果表达式为假,assert宏就按照实现定义的格式向标准的错误文件写入关注与之歌特定调用的失败信息,然后调用abort函数终止程序。 |
3. assert的使用
3.1 打开和关闭断言的方法:
- 打开断言:
#undef NDEBUG
#include<assert.h>
- 关闭断言:
#define NDEBUG
#include<assert.h>
3.2 assert使用注意事项
- 不要使用断言作为公共方法的参数检查,公共方法的参数永远都要执行
- 断言语句不可以有任何边界效应,不要使用断言语句去修改变量和改变方法的返回值.
- 程序一般分为Debug版本和Release版本,Debug版本用于内部调试,Release版本发行给用户使用。断言assert是仅在Debug版本起作用的宏。
- 建议程序中使用assert的地方:
- 空指针检查。例如,针对一个函数的参数进行空指针检查。你可以这样使用:assert (pointer != NULL);,产生的错误会像这样:Assertion ‘pointer != ((void *)0)’ failed。这样,当出现空指针时,你的程序就会退出,并很好的给出错误信息。
- 检查函数参数的值。例如,如果一个函数只能在它的一个参数foo为正值的时候被调用,你可以在函数开始时这样写:assert (foo > 0);,这将帮助你检测函数的错误使用,这也给源代码阅读者很清晰的印象,那就是在这里对函数的参数值有限制。