使用assert()时,必须添加头文件<assert.h>
原型:void assert(int expression);
如果expression求值为真(非零),则assert()不做任何操作。
如果expression求值为假(零),则assert()会打印一条错误消息,并调用abort()函数终止程序执行。
void abort(void) 中止程序执行,直接从调用的地方跳出。
存在于库 stdlib 中
示例:
int x = 5;
int y = 10;
assert(x < y); // 不做任何操作
x = 15;
assert(x < y); // 打印错误并终止程序
这里如果x >= y,则认为程序错误,断言失败,打印错误并停止。
assert()非常适合进行程序内部的逻辑检查,捕获不应该出现的情况。
assert本质上是一个宏,在使用这个宏时,也可以在后面加上字符串自定义错误信息。如:
assert(x>0)("x must be positive")
另外
在新发布的版本中定义了宏NDEBUG。
NDEBUG就是一个预定义的宏,它表示“no debugging”的意思。
在代码中定义了NDEBUG后,所有包含<assert.h>的assert语句都会被关闭,不进行任何检查和验证。
也就是说:
#define NDEBUG
#include <assert.h>
//...
assert(x > 0);
这里的assert不会有任何效果。
NDEBUG通常在发布产品的时候定义,以关闭assert,避免影响程序效率。
在调试过程中不定义NDEBUG,这样可以打开assert来帮助调试。
总之,NDEBUG是一个控制宏,通过定义它来关闭assert断言语句,这是assert的一个重要机制。