断言可以对在系统中隐藏很深,用其它手段极难发现的问题进行定位,并且输出信息很详细,可以很好地解决大多数C语言编译器错误信息输出不详细的问题。
断言是对某种条件进行检测,若条件成立则无反应,否则程序执行到断言处终止,同时输出为成立的条件。
assert是一个宏定义,并不是函数。
如
#include <assert.h>//assert所在头文件
void main()
{
int i = 9;
assert(i == 0);
}
则程序输出如下:
Assertion failed!
Program: E:\C\t_assert.exeFile: E:\C\t_assert.c, Line 8Expression: i == 0
This application has requested the Runtime to terminate it in an unPlease contact the application's support team for more information.
经常调用断言,会极大地增加程序的开销,可以通过以下方法使断言机制,使只在debug下,使用断言机制。
这种情况下,不要包含头文件 assert.h
``#ifndef NDEBUG
#define assert(exp) ((void)0)#else#define assert(exp) (void)( (exp) || (_assert(#exp, __FILE__, __LINE__), 0) )
在没有定义 NDEBUG下,assert被定义为 (void)0,无意义语句,而且对程序没有什么影响。
在定义NDEBUG时,断言会输出 不成立的条件 和 语句所在文件和行,所以我们可以在debug时,在上述代码之前,定义 NDEBUG ,在程序作为成品交出时, 删除NDEBUG的宏定义。