断言ASSERT() 是什么

ASSERT()一般被称为断言,它是一个调试程序时经常使用的宏。

它定义在<assert.h>头文件中,通常用于判断程序中是否出现了非法的数据,在程序运行时它计算括号内的表达式的值。

在此强调的一点,ASSERT()捕获的是非法情况,而非错误情况,错误情况是必然存在的,并且一定需要作出相应的处理,而非法情况则不是,它可能只是漏洞而已。

其用法如下:


ASSERT(n  != 0);
k = 10/n;

需要注意的是,ASSERT()只在Debug版本中有,编译的Release版本则被忽略。

还需要注意的是ASSERT()与asser() 的区别,ASSERT() 是宏,而 assert()是ANSIC标准中规定的函数,它与ASSERT()的功能类似,但是可以应用在Release版本中。

使用assert()的缺点是,频繁的调用会极大影响程序的性能,增加额外的开销。

在调试结束后,可以通过在包含#include<assert.h>的语句之前插入#define  NDEBUG来禁用assert()调用。示例代码如下:

		#include<stdio.h>
		#define NDEBUG
		#include <assert.h>

对于assert()的使用,需要注意以下几个方面:

(1)在函数开始处检验传入参数的合法性。例如:

assert(nNewSize >= 0);

assert ( nNewSize <= MAX_BUFFER_SIZE);

(2)每个assert()一般只检查一个条件,而不对多个进行检验,因为同时检验多个条件时,如果是断言失败,则无法直观地判断是哪个条件失败。

例如,assert(nOffset >= 0 && nOffset+nSize <= m_nInformationSize)就不是一种高效的方式,它无法判断是 nOffset >= 0 有误还是nOffset+nSize <= m_nInformationSize有误,而将该语句分开表示为如下两个简单语句则更好:assert(nOffset >= 0)和assert(nOffset+nSize <= m_nInformationSize)

(3)不能使用改变环境的语句,因为assert只在DEBUG时生效,如果这么做,会使程序在真正运行时遇到问题。例如,assert(i++<100)就是错误的。如果执行出错,在执行之前i=100;那么这条语句就不会执行,i++这条命令就没有执行。而正确的写法应该为assert(i<100);i++。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值