断言—assert()
文章目录
1. 概述
- assert是调试宏而不是一个函数,只在debug才有效。
- 判断条件结果为假(NULL)抛出异常,或者说条件不成立时抛出异常。
- 使用 assert 来捕捉程序运行过程中出现的非法情况,在你的程序中,
如果你认为某种情况肯定不会出现,一旦出现,就说明你的程序在某块存在错误
,比如除法时除数不为0,此时最好用 assert 断言;而该情况可能会出现且是合法情况,此时最好用if来判断,比如 malloc 空间时返回 NULL 。
2. 定义
- assert 宏的原型定义在 <assert.h> 中,其作用是如果它的条件返回错误,则终止程序执行
- 在刚开始学习代码的时候,对于程序中检查程序有效性时有时用到assert,有时用if,感到非常困惑。比如,在多数的 malloc 函数后面对指针进行的操作都是用 assert 进行检查的,可能会造成一种错觉以为在 malloc 之后对申请空间的检测是用 assert 进行的,但可能也会看到用 if 对 malloc 进行判断并处理,到底是 if 还是 assert 呢?
- 以下是库中关于assert的定义,我将其他一些地方去掉了:
#ifdef NDEBUG
#define assert(_Expression) ((void)0)
#else
#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )
#endif
NDEBUG 为非调试模式,即 release 模式。可以看到,在 release 模式下 assert 宏什么事情都没有干,但是在 debug 模式下,如果表达式的值为 0,则输出消息并终止程序的执行。表达式为真时不会进行任何操作。所以断言失败,就表明程序存在 bug,出现了预期不应该出现的情况。也就是说在 release 模式下,assert 宏相当于不存在了(在 vs2012 上测试确实如此)
。