ASSERT() 是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序:     
......     
ASSERT( n != 0);     
k = 10/ n;     
......
限制性:
ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。
区别性:
assert()的功能类似,它是ANSI C标准中规定的函数,它与ASSERT的一个重要区别是可以用在Release版本中。assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include <assert.h> void assert( int expression );
缺点:
使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。所以在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下: #include <stdio.h> #define NDEBUG #include <assert.h>

ASSERT用法

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

int CBufferPool::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)
正确: ASSERT(i < 100)       i++;

4)ASSERT和后面的语句应空一行,以形成逻辑和视觉上的一致感

5)有的地方,ASSERT不能代替条件过滤

如: int CDecodeBuffer::GetIntValue(int nOffset, int nSize) const { //功能:取出缓冲区中的一个有符号整数 //参数:nOffset   开始位置 //     nSize     字节数 //返回值: 如可在法位置返回正常值 否则为INVALID_VALUE
//建立日期:2005-09-12
ASSERT(nOffset >= 0);
ASSERT(nOffset+nSize <= m_nInfomationSize);
int nReturnValue = INVALID_VALUE;
if (nOffset>=0 && nOffset+nSize<=m_nInfomationSize) {

一个完整的例子 :

如: BYTE CDecodeBuffer::GetBit(int nByteStart, int nBitOffset) const {
//取缓冲区中的一个位 // nByteStart 开始字节
ASSERT(nByteStart >= 0);
ASSERT(nBitOffset >= 0);
BYTE nReturn=0;
nBitOffset = nByteStart*8+nBitOffset; ASSERT((nBitOffset+7)/8 <= m_nInfomationSize);
if (nBitOffset>=0 && (nBitOffset+7)/8<=m_nInfomationSize) {   
nReturn = GET_BIT(m_pBufferHead[nBitOffset/8],nBitOffset%8);
}
return nReturn;
}

转载于:https://www.cnblogs.com/zhanglanyun/archive/2012/02/02/2335969.html

断言assert的使用相关推荐

  1. java断言assert初步使用:断言开启、断言使用

    1 说明 java断言assert是jdk1.4引入的. jvm断言默认是关闭的. 断言可以局部开启的,如:父类禁止断言,而子类开启断言,所以一般说"断言不具有继承性". 断言只适 ...

  2. C语言断言assert()函数

    文章目录 断言(assert)的用法 用法总结与注意事项 1)在函数开始处检验传入参数的合法性 2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败 ...

  3. 断言(assert)详解

    目录 一.assert定义 二.用法总结与注意事项 四.以下是使用断言的几个原则: 一.assert定义 我一直以为 assert 仅仅是个报错函数,事实上,它居然是个宏,并且作用并非"报错 ...

  4. python断言assert实例_Python断言assert的用法代码解析

    在开发一个程序时候,与其让它运行时崩溃,不如在它出现错误条件时就崩溃(返回错误).这时候断言assert 就显得非常有用. python assert断言是声明布尔值必须为真的判定,如果发生异常就说明 ...

  5. python(11)-if语句,断言assert

    分支语句if 1.if基本语法 2 if语句的嵌套 3 比较运算符号 4 逻辑运算符: 5 整数随机数初应用 6 tip 7.断言assert 1.if基本语法 if语句开发中的应用场景:如果条件成立 ...

  6. python断言assert实例_Python 拓展之断言(assert)

    写在之前 大家好,这是首发在我公众号「Python空间」的第 60 篇文章,欢迎关注,期待和你的交流. 在昨天的文章中(零基础学习 Python 之处理异常)中学习了处理异常的正确姿势,今天我们继续来 ...

  7. 断言(Assert)与异常(Exception)

    断言(Assert)与异常(Exception) 参考文章: (1)断言(Assert)与异常(Exception) (2)https://www.cnblogs.com/lionden/p/Asse ...

  8. java 断言 assert 初步使用:断言开启、断言使用

    主要总结一下在eclipse中如何使用断言. (一)首先明确: java断言Assert是jdk1.4引入的. jvm 断言默认是关闭的. 断言只适用于复杂的调试过程. 断言一般用于程序执行结果的判断 ...

  9. 理解和正确使用Java中的断言(assert)

    理解和正确使用Java中的断言(assert) 一.语法形式:     Java2在1.4中新增了一个关键字:assert.在程序开发过程中使用它创建一个断言(assertion),它的 语法形式有如 ...

  10. java 断言 assert 详解:断言开启、断言使用

    java中的断言Assert的使用 一.背景 二.如何判断是否开启了断言 三.开启断言 四.断言的使用 方法一.assert <boolean表达式> 方法二.assert <boo ...

最新文章

  1. 【计算机网络】数据链路层 : 信道划分 介质访问控制 ( 数据链路 | 介质访问控制分类 | 频分多路复用 FDM | 时分多路复用 TDM | 波分复用 WDM | 码分多路复用 CDM 计算 )★
  2. php warning date(),lnmp打开cacti时提示PHP Warning: date()
  3. phpcms v9宽字节注入问题
  4. [HNOI2013]比赛 搜索
  5. python全局变量修改_python中全局变量的修改
  6. 打破独立游戏开发者的困局
  7. 死锁、活锁、性能问题
  8. python pyspark用法
  9. MES系统如何实现工厂无纸化生产?
  10. 数据库小白 T-SQL练习500题 超详细!带素材!持续更新中~
  11. tensorflow2 unet加载自己的图像进行训练
  12. bool类型转int, 或者bool数组对象转int/float数组对象
  13. 新西兰梅西大学有计算机专业吗,【新西兰梅西大学计算机专业】 - 教外新西兰留学网...
  14. 文字转化为二维码(数据加密)
  15. 从本质如何理解机器学习
  16. 修改VMware虚拟机IP地址为指定IP
  17. Credential Provider
  18. 一些关于HTML与CSS的总结与实际应用
  19. 【条形码识别】基于matlab条形码识别【含Matlab源码 403期】
  20. SSH 详解(实践及应用)

热门文章

  1. 大华平台linux命令,大华平台软件简介.docx
  2. 前端----JavaScript
  3. 计算机控制系统功能,计算机控制系统功能之操作指导-电脑自学网
  4. LeetCode之验证二叉搜索树
  5. sql的执行顺序(from平凡世界)
  6. java基础总结06-常用api类-System类常用方法
  7. mysql 慢查询及深入调优
  8. Linux chapter 2
  9. ubuntu 20 /CentOS 8.x/MAC 系统 中安装GO LANG(GO语言)
  10. RequestContextHolder 获取 ServletRequest 和 ServletResponse,Spring MVC ModelAndView 数据响应 Response