assert的用法

发布时间:2017-3-1 0:46:41 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"assert的用法",主要涉及到assert的用法方面的内容,对于assert的用法感兴趣的同学可以参考一下。

 MSDN里是这样描述ASSERT宏的: ASSERT ASSERT( booleanExpression ) Parameters booleanExpression Specifies an expression (including pointer values) that evaluates to nonzero or 0. Remarks Evaluates its argument. If the result is 0, the macro prints a diagnostic message and aborts the program. If the condition is nonzero, it does nothing. The diagnostic message has the form assertion failed in file <name> in line <num> where name is the name of the source file, and num is the line number of the assertion that failed in the source file. In the Release version of MFC, ASSERT does not evaluate the expression and thus will not interrupt the program. If the expression must be evaluated regardless of environment, use the VERIFY macro in place ofASSERT. Note   This function is available only in the Debug version of MFC. Example // example for ASSERT CAge* pcage = new CAge( 21 ); // CAge is derived from CObject. ASSERT( pcage!= NULL ) ASSERT( pcage->IsKindOf( RUNTIME_CLASS( CAge ) ) ) // Terminates program only if pcage is NOT a CAge*.     ASSERT() 是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序:     ......     ASSERT( n != 0);     k = 10/ n;     ......     ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。     assert()的功能类似,它是ANSI C标准中规定的函数,它与ASSERT的一个重要区别是可以用在Release版本中。 在开发过程中我们可以假设只要程序运行正确,某一条件肯定成立。如不成立,那么我们可以断言程序肯定出错。 在这种情况下我们可以利用ASSERT来设定断言。ASSERT宏的参数是一个逻辑表达式,在程序运行过程中,若该逻辑表达式为真,则不会发生任何动作,若此表达式为假,系统将弹出一个对话框警告你,并停止程序的执行。同时要求你作出选择:Abort,Ignore, Retry。若你选择Abort,系统将停止程序的执行;若你选择Ignore 系统将忽略该错误,并继续执行程序;若你选择Retry ,系统将重新计算该表达式,并激活调试器。 同TRACE宏一样,ASSERT宏只DEBUG版本中起作用,在RELEASE版本中ASSERT宏将被忽略。 assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include <assert.h> void assert( int expression );  assert的作用是现计算表达式 expression ,如果其值为假(即为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; }[[email protected] error_process]# gcc badptr.c [[email protected] 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不能代替条件过滤。

上一篇:我的博客今天2岁239天啦!
下一篇:Oracle 获取当前年、月、日

相关文章

关键词: assert的用法

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。