请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

猿媛之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 3151|回复: 0

(C/C++)断言ASSERT( )是什么

[复制链接]

44

主题

48

帖子

198

积分

注册会员

Rank: 2

积分
198
发表于 2016-1-25 21:14:35 | 显示全部楼层 |阅读模式
    ASSERT( )一般被称为断言,它是一个调试程序时经常使用的宏。它定义在<assert.h>头文件中,通常用于判断程序中是否出现了非法的数据,在程序运行时它计算括号内的表达式的值。如果表达式的值为false(0),程序报告错误,终止运行,以免导致严重后果,同时也便于查找错误;如果表达式的值不为0,则继续执行后面语句。在此需要强调一点,ASSERT( )捕获的是非法情况,而非错误情况,错误情况是必然存在的,并且一定需要作出相应的处理,而非法情况则不是,它可能只是漏洞而已。
    其用法如下:
        ASSERT (n!=0);
        k=10/n;
    需要注意的是ASSERT( )只在Debug版本中有编译的Release版本则被忽略。还需要注意的一个问题是ASSERT( )assert( )的区别,ASSERT( )是宏,而assert( )ANSIC标准中规定的函数,它与ASSERT( )的功能类似,但是可以应用在Release版本中。
    使用assert( )的缺点是,频繁的调用会极大地影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含#include<assert.h>的语句之前插入#define NDEBUG 来禁用assert( )调用,示例代码如下:
  1. <font size="3">#include <stdio.h>
  2. #define NDEBUG
  3. #include <assert.h></font>
复制代码
    对于assert( )的使用,需要注意以下几个方面:
    (1在函数开始处检验传入参数的合法性。例如:
        assert(nNewSize >= 0);
        assert(nNewSize <= MAX_BUFFER_SIZE);
    (2每个assert( )一般只检验一个条件,而不对多个条件进行检验,因为同时检验多个条件时,如果断言失败,则无法直观地判断是哪个条件失败。例如,assert(nOffset>=0 && nOffset+
nSize<=m_nInfomationSize)就不是一种高效的方式,它无法判断是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( )都能代替过滤条件,对于有的地方,assert( )无法达到条件过滤的目的。
    (5)一般在编程的时候,为了形成逻辑和视觉上的一致性,会将assert( )与后面的语句之间空一行来隔开

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|猿媛之家    

GMT+8, 2020-2-28 13:55 , Processed in 0.185036 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表