CC++ 中 ASSERT的使用 assertraises的使用
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
#include <assert.h>
void assert( int expression_r_r );
assert的作用是现计算表达式expression_r_r,如果其值为假(即为0),那么它先向stderr打印一条出错信息,
然后通过调用abort来终止程序运行。
请看下面的程序清单badptr.c:
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
int main( void )
{
FILE *fp;
fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件
assert( fp );//所以这里不会出错
fclose( fp );
fp=fopen( "noexitfile.txt", "r");//以只读的方式打开一个文件,如果不存在就打开文件失败
assert( fp );//所以这里出错
fclose( fp );//程序永远都执行不到这里来
return 0;
}
[root@localhost error_process]# gcc badptr.c
[root@localhost error_process]# ./a.out
a.out: badptr.c:14: main: Assertion `fp' failed.
已放弃
使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。
在调试结束后,可以通过在包含#include <assert.h>的语句之前插入#define NDEBUG来禁用assert调用,示例代码如下:
#include <stdio.h>
#define NDEBUG
#include <assert.h>
用法总结与注意事项:
1)在函数开始处检验传入参数的合法性
如:
int resetBufferSize(int nNewSize)
{
//功能:改变缓冲区大小,
//参数:nNewSize 缓冲区新长度
//返回值:缓冲区当前长度
//说明:保持原信息内容不变nNewSize<=0表示清除缓冲区
assert(nNewSize >= 0);
assert(nNewSize <= MAX_BUFFER_SIZE);
...
}
2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败
不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
好: assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);
3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题
错误: assert(i++ < 100)
这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。
正确: assert(i < 100)
i++;
4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感
5)有的地方,assert不能代替条件过滤
VC中ASSERT的用法(转载)
ASSERT(pcage!=NULL)
ASSERT(pcage->IsKindOf(RUNTIME_CLASS(CAge)))
编译过程中判断语句的成功(合法)函数
是一种断言语句。主要用来调试程序
就是说Debug(调试)的时候,ASSERT(*******)这句要运行,
但是到了release的时候,ASSERT(*******)这句就忽略不运行,
作检查用,release时不运行,是为了提高速度。
ASSERT( booleanexpression_r_r );
首先:booleanexpression_r_r参数是一个bool表达式。
用法:
当程序运行到该语句的时候,程序会检查booleanexpression_r_r这个表达式是真还是假。
如果条件符合,程序继续运行下面的代码;
如果是不符合,那么持续运行会被卡在这里。不往下面走,并有程序弹出错误对话框,指示是由于booleanexpression_r_r这个条件符合导致的报错。
作用:
ASSERT(booleanexpression_r_r )语句一般用来检查一些必须符合的条件,如果不符合条件,则不让程序继续运行下去。
比如:
一个班有55个人,有一个函数可以对班上的55个人进行处理,一个单独处理一个同学也可以,也可以同时处理多个同学。函数申明为:CONTROLSTUDENT(int number);其中number为要处理的学生的个数。
在使用CONTROLSTUDENT函数前,一般我们会使用
ASSERT(number<=55);
CONTROLSTUDENT(number);
这样可以保证输入的学生数目绝对小于等于55个人。
如果输入的number参数大于55,程序将报错,不执行。
总结:该指令可以用来做为某些条件的防护,避免不符合条件的东西产生导致程序的崩溃
assert 和 if 的区别
首先,这两个处于c语言中的不同等级,assert不过是系统提供的一个函数,而if则是关键字。
其次,两个的语法也不一样,你可以写if( 1 ){}但是写个assert(1){}却不对,当然,这个区别是第一点造成的
在语义上,if就不用解释了吧。assert的语义如下:在debug编译模式下,如果assert的表达式求值为false,就会中断程序;在release模式下,则没有任何操作。因此可以说,assert就是在调试模式下用来确保制定条件被满足的一种手法,比如说,你想确保a>0,你就可以写assert( a > 0 );如果在运行过程中,a<=0了,代码就会中断,利用调试器很容易发现问题所在。在“应用程序调试"一书里,作者强烈推荐使用assert
更多阅读
word2013中表格的橡皮擦使用方法 word表格橡皮擦在哪里
word2013中表格的橡皮擦使用方法——简介word2013现在用的人越来越多了,但是由于这个版本与之前的版本有好多不一样的地方,好多工具的位置都变了。下面讲一下word2013中表格中橡皮擦的使用方法。word2013中表格的橡皮擦使用方法——
如何在Photoshop中打开并使用pat格式的文件 精 photoshop打开png格式
如何在Photoshop中打开并使用pat格式的文件 精——简介我们在使用PS做设计和绘画时,有时会使用到一些下载的素材。下载到pat格式的文件时,发现它并不能用PS直接打开。那么如何使用pat格式的文件呢,其实它的使用方法和笔刷一样,是需要载
鸿合电子白板在使用过程中常见的几个问题的解决方法 鸿合电子白板
(应电子白板应用的同行要求,本文在不断更新中,并从今天开始置顶此文。)应用鸿合电子白板过程中常见问题的解决方法顺德杏坛中学 刘朝明最近,常有老师问到我在使用电子白板过程中遇到的各种问题,有些问题很有代表性和普遍性,本文以问答
oracle中OracleCachedRowSet的使用 git rm cached 使用
RowSet是JDBC2.0中提供的接口,Oracle对该接口有相应实现,其中很有用的是oracle.jdbc.rowset.OracleCachedRowSet。OracleCachedRowSet实现了ResultSet中的所有方法,但与ResultSet不同的是,OracleCachedRowSet中的数据在Connection关闭
关于客所思声卡和iskuk400声卡在使用过程中碰到的几个问题和处理 iskuk400外置声卡调试
关于客所思声卡和iskuk400声卡在使用过程中碰到的几个问题和处理的方法1.屏蔽掉你电脑上自带的声卡,怎么屏蔽。你先拔掉客所思声卡,如果你的电脑是XP系统那么你就对着我的《电脑点右键—属性—硬件—设备管理—声音视频游戏控制器》-