CC++ 中 ASSERT的使用 assertraises的使用

assert用法(转载)

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

  

爱华网本文地址 » http://www.aihuau.com/a/25101012/143498.html

更多阅读

word2013中表格的橡皮擦使用方法 word表格橡皮擦在哪里

word2013中表格的橡皮擦使用方法——简介word2013现在用的人越来越多了,但是由于这个版本与之前的版本有好多不一样的地方,好多工具的位置都变了。下面讲一下word2013中表格中橡皮擦的使用方法。word2013中表格的橡皮擦使用方法——

oracle中OracleCachedRowSet的使用 git rm cached 使用

RowSet是JDBC2.0中提供的接口,Oracle对该接口有相应实现,其中很有用的是oracle.jdbc.rowset.OracleCachedRowSet。OracleCachedRowSet实现了ResultSet中的所有方法,但与ResultSet不同的是,OracleCachedRowSet中的数据在Connection关闭

声明:《CC++ 中 ASSERT的使用 assertraises的使用》为网友离开是我选的分享!如侵犯到您的合法权益请联系我们删除