C++ ASSERT() 断言机制
ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0),
程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。

原型定义:
#include <assert.h>
void assert( int expression_r_r_r );
assert的作用是现计算表达式 expression_r_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不能代替条件过滤

ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略掉。(在C中,ASSERT是宏而不是函数),使用ASSERT“断言”容易在debug时输出程序错误所在。
而assert()的功能类似,它是ANSI C标准中规定的函数,它与ASSERT的一个重要区别是可以用在Release版本中。

C++ ASSERT() 断言机制相关推荐

  1. PIM DM模式下的pim Assert 断言机制

    PIM DM模式下断言机制 1.比较路由优先级,优先级高的获胜 2.比较到组播源的开销,开销小的获胜 3.比较端口IP,大的获胜 如下图,PIM DM模式,R1.R2.R3.R4使用ospf路由协议, ...

  2. C 语言编程 — 使用 assert 断言进行程序设计

    目录 文章目录 目录 断言 利用断言来提高代码的可测试性 自定义断言来满足需求 尽量在函数中使用断言来检查参数的合法性 避免在断言表达式中使用改变环境的语句 避免使用断言去检查程序错误 在防错性程序设 ...

  3. PIM-DM中的扩散-剪枝跟断言机制后180s定时器

    一直纠结那个断言机制后loser的定时器180s跟剪枝定时器210s的问题. 上篇内容,我们看到剪枝定时器210s,也就是说在R1在210s内是无法再通过g2/0/0转发组播报文,而通过抓包,情况也相 ...

  4. Python assert断言函数及用法

    Python assert断言函数及用法 Python assert 语句,又称断言语句,可以看做是功能缩小版的 if 语句,它用于判断某个表达式的值,如果值为真,则程序可以继续往下执行:反之,Pyt ...

  5. python assert 断言的作用

    python assert 断言句语格式及用法很简单.在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件时就崩溃,这时候就需要assert断言的帮助.本文主要是 ...

  6. Python assert 断言

    assert断言语句用来声明某个条件是真的,其作用是测试一个条件(condition)是否成立,如果不成立,则抛出异常. assert一般用法: assert condition 如果conditio ...

  7. Python assert 断言函数

    使用assert断言是学习python一个非常好的习惯,python assert 断言句语格式及用法很简单.在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件 ...

  8. matlab语言中的assert断言函数

    1.MATLAB语言没有系统的断言函数,但有错误报告函数 error 和 warning.由于要求对参数的保护,需要对输入参数或处理过程中的一些状态进行判断,判断程序能否/是否需要继续执行.在matl ...

  9. C++assert 断言

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105022662 C ...

最新文章

  1. Jupyter官方神器:可视化 Debug 工具!
  2. FPGA 和ASIC开发的区别
  3. 正则表达式--密码复杂度验证--必须包含大写、小写、数字、特殊字符中的至少三项
  4. Unsafe使用技巧之数组操作
  5. 中文格式_常见中文编码格式
  6. .NET 5开源项目:b站账号快速升级到 Lv6,每天自动签到,观看,分享,投币视频!...
  7. 80-30-040-原理-React模式-简介2
  8. 【转】移动Web开发-点击事件及页面滚动
  9. web产品设计的经典著作
  10. 带妹入坑,她该怎样提高自己的编程能力?
  11. 在Windows中的“运行”对话框中调整历史记录
  12. 教会如何使用WordPress提供在线讲道
  13. Unity中控制物体运动
  14. 最近收集的一些酷炫的UI界面设计
  15. 最近看到需要去学习的点(持续记录)
  16. Krita开发文档翻译——Introduction to Hacking Krita
  17. ConcurrentHashMap1.7 最最最最最详细源码分析
  18. php 模板 下载xml,模板用xml的思路_PHP
  19. 2018年十大区块链投资机构盘点-千氪
  20. 用ros中apriltag码进行定位(记录一下)

热门文章

  1. python xml etree_python解析xml文件之xml.etree.cElementTree和xml.etree.ElementTree区别和基本使用...
  2. android点击下拉历史记录,uni-app,社交应用中,聊天页面下拉onPullDownRefresh获取历史消息,数据合并之后,滚动到下拉之前的位置,页面看不见闪动,完美解决...
  3. java 考试复习整理——JAVA类和类成员的修饰符
  4. 初始序列为1 8 6 2 5 4 7 3一组数采用堆排序,当建堆(小根堆)完毕时,堆所对应的二叉树中序遍历序列为
  5. 【c】写头文件要加#ifndef,#define, #endif
  6. 【C++11新特性】 C++11智能指针之shared_ptr
  7. 网易严选Java开发三面面经:java技术编程培训班
  8. 这些年Android面试的那些套路,社招面试心得
  9. C# 篇基础知识10——多线程
  10. BZOJ 3527: [ZJOI2014]力(FFT)