assert.h是c标准库的一个头文件,该头文件的主要目的就是提供一个assert的宏定义。
assert只是对所给的表达式求值,就像if判断语句中一样,然后如果该值为真则正常运行,否则报错,并调用abort(),产生异常中断,exit出来。
该宏可以屏蔽掉,只需在包含assert.h之前#define NDEBUG,想开再#undef。从这里可以看出预处理带来的方便。接下来具体来看:
assert()函数使用总结
对于c语言来说,最多出现的就是函数了,今天我们来认识一下assert()函数,assert宏的原型定义在中,他的作用就是如果他的条件返回错误,那么就终止程序执行,而他的语法定义如下:
#include
void assert( int expression );
在上面原型定义中,assert的作用是计算表达式expression,如果他的值为假的话,就会向stderr打印一条出错信息,然后再通过调用abort 来终止程序运行。
如果不使用assert()函数,他会频繁的调用会机打的影响程序的性能,我们在调试结束后,可以用通过在包含#include 的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:
#include
#define NDEBUG
#include
assert()函数用法注意事项
1)在函数开始处检验传入参数的合法性如:
复制代码
int resetBufferSize(int nNewSize)
{
//功能:改变缓冲区大小,
//参数:nNewSize 缓冲区新长度
//返回值:缓冲区当前长度
//说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区
assert(nNewSize >= 0);
assert(nNewSize <= MAX_BUFFER_SIZE);
...
}
复制代码
(2)每一个assert他是只需要检验一个条件的,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败,这里要切记。
3)在使用assert的时候,不能使用改变环境的语句,这是因为assert只在DEBUG中生效,如果这么做,会使用程序在真正运行时遇到问题,如:
A、assert(i++ < 100);
B、assert(i < 100);i++;
前者是错误的,后者才是正确的,通过这两个对比,你就可以看出来,前者本来就出错了,他这条语句就不会执行了。
4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感。
5)有的地方,assert不能代替条件过滤。
我们前面也提到断言了,那到底断言如何来使用呢,总结了一些使用的注意事项:
(1)使用断言对函数的参数进行确认。
(2)在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。
(3)使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。
Assert()他是一个调试程序的时候经常使用的宏,而且ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。
最常使用assert的有几个地方:一个是空指针检查,另外一个是检查函数参数的值。
学习assert()函数你要掌握这些知识点,不要急躁,慢慢学