浅析assert宏

浅析assert宏

文章目录

  • 浅析assert宏
    • 前言
    • 1. 简单的断言案例
    • 2. 断言与正常错误处理
    • 3. 断言的应用场景
    • 总结

前言

首先声明一点,断言(assert)是宏,而非函数

​ assert 宏的原型定义在 <assert.h>(C)、(C++)中。其作用是如果它的条件返回错误,则终止程序执行。


1. 简单的断言案例

#include <cassert>	// cpp包含的头文件void test1()
{int x = 10;assert(x == 20);
}

运行结果:

在这里插入图片描述

可以看到输出会把源码文件,行号错误位置,提示出来!

2. 断言与正常错误处理

  • 断言主要用于检查逻辑上不可能的情况。

例如,它们可用于检查代码在开始运行之前所期望的状态,或者在运行完成后检查状态。与正常的错误处理不同,断言通常在运行时被禁用。

  • 忽略断言,在代码开头加上:
#define NDEBUG		// 加上这行,则 assert 不可用

示例代码:

在这里插入图片描述

为什么加了 #define NDEBUG 语句assert宏仍然在发挥作用?特别注意,用于禁用 assert 宏的该语句应该置于 #include<assert.h>(或)之前!

3. 断言的应用场景

​ 一般来说,assert 和异常都是用来检测程序中的错误和异常情况的,但它们的使用场景和目的有所不同。

  • assert 适合用于验证程序内部的逻辑和不变量,即那些在正常情况下不应该发生的错误,比如参数的类型和范围,函数的返回值,循环的终止条件等。如果 assert 失败,说明程序中存在严重的缺陷或者假设不成立,需要立即终止程序并进行调试异常适合用于处理程序外部的错误和异常情况,即那些由用户输入,网络通信,文件操作,数据库访问等引起的错误,比如输入不合法,网络断开,文件不存在,数据库连接失败等。
  • 如果发生异常,程序可以捕获并处理异常,或者向上层抛出异常,以便恢复程序的正常运行或者给出友好的提示。

因此,assert 和异常的区别可以归纳为以下几点:

  • assert 是一种调试工具,用于开发和测试阶段,可以在编译或运行时关闭,而异常是一种错误处理机制,用于生产环境,不能被关闭
  • assert 用于检查程序内部的错误,如果失败,程序会终止,而异常用于处理程序外部的错误,如果发生,程序可以继续执行。
  • assert 不检查错误类型,只有一个 AssertionError,而异常有多种类型,可以根据不同的类型进行不同的处理。
  • assert 的参数是一个布尔表达式,而异常的参数是一个异常对象,可以携带更多的信息。

总结

​ assert 宏的优点是可以在开发和调试阶段快速发现和定位程序中的错误,提高代码的可测试性和可靠性。assert 宏的缺点是可能会影响程序的性能,暴露敏感信息,或者在生产环境中导致令用户困惑的行为。

​ 因此,通常在发布程序时会禁用 assert 宏,只在内部调试版本中启用。禁用 assert 宏的方法是在包含 <assert.h> 头文件之前定义 NDEBUG 宏,或者在编译命令行中定义 NDEBUG 宏。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/518361.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DIN11 OC系列导轨式光电隔离变送器模拟信号转换0-75mV0-50mV0-100mV转4-20mA0-5V0-10V

概述&#xff1a; 导轨安装DIN11 IPO OC系列模拟信号隔离放大器是一种将输入信号隔离放大、转换成按比例输出的直流信号混合集成厚模电路。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等需要直流信号隔离测控的行业。此系列产品内部采用了线性光电隔离技术相…

C++ 哈希表OJ

目录 1、1. 两数之和 2、面试题 01.02. 判定是否互为字符重排 3、217. 存在重复元素 4、 219. 存在重复元素 II 5、49. 字母异位词分组 频繁查找某一个数的时候可以使用哈希表&#xff0c;哈希表可以使用容器&#xff0c;也可以使用数组模拟&#xff0c;当元素是字符串中的字…

类和对象周边知识

再谈构造函数 前几期我们把六个默认成员函数一一说明后&#xff0c;构造函数还有一些周边知识。 初始化列表 我们在没有了解初始化列表的时候一般都是使用构造函数初始化或者在声明哪里给予缺省值&#xff0c;那么为什么好药存在初始化列表呢&#xff1f;是因为①.有些值必须…

软件测试面试200问(全)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xf…

CleanMyMac X4.14.7永久免费Mac电脑清理和优化软件

CleanMyMac X 是一款功能强大的 Mac 清理和优化软件&#xff0c;适合以下几类人群使用&#xff1a; 需要定期清理和优化 Mac 的用户&#xff1a;随着时间的推移&#xff0c;Mac 设备上可能会积累大量的无用文件、缓存和垃圾&#xff0c;导致系统运行缓慢。CleanMyMac X 的智能扫…

onlyOffice-windows 安装说明(二)

onlyoffice windows 安装 onlyoffice 支持多个平台比如&#xff1a;Windows Server、Linux、Docker 以下内容是对官网安装说明做了简单翻译&#xff0c;仅供参考&#xff0c;原文链接地址参见文末。 社区版允许您在本地服务器上安装ONLYOFFICE文档&#xff0c;并将在线编辑器…

stl的基本知识学习

1.vector&#xff1a; 2.set&#xff1a; 3.map&#xff1a; 4.栈&#xff1a; 5.队列&#xff1a; 6. unordered_map与unordered_set: 7. 位运算&#xff1a; 8.cctype&#xff1a; 导图&#xff1a;

C++ 路径问题

目录 例1 例2 例3 例4 例5 例6 例1 62. 不同路径 1.初始化 2.当前位置的条数&#xff0c;就是上面位置的条数 &#xff0c;加上其左边位置的条数&#xff0c;dp[i][j] dp[i - 1][j] dp[i][j - 1]; 参考代码 class Solution { public:int uniquePaths(int m, int n) …

CentOS上安装MySQL 5.7和MySQL 8.0教程

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

第二证券|转融通是什么意思?转融通通俗理解

转融通是指证券金融公司借入证券、筹得资金后&#xff0c;再转借给证券公司&#xff0c;是一假贷关系&#xff0c;详细是指证券公司从符合要求的基金办理公司、保险公司、社保基金等组织投资者融券&#xff0c;再将这部分证券转借给其它证券公司。 转融通包含转融券和转融资这…

阿里云ECS磁盘扩容操作手册

云原生专栏大纲 文章目录 ESC磁盘扩容步骤前提条件云盘备份云盘扩容扩容分区和文件系统前提条件操作视频操作步骤准备工作&#xff1a;获取目标云盘信息步骤1&#xff1a;扩容分区步骤2&#xff1a;扩容文件系统 ESC磁盘扩容步骤 扩容已有云盘的操作步骤和注意事项_云服务器 …

用开发CesiumJS模拟飞机飞行应用(一,基本功能)

本部分向您展示如何构建您的第一个 Cesium 应用程序&#xff0c;以可视化模拟从旧金山到哥本哈根的真实航班&#xff0c;并使用 FlightRadar24收集的雷达数据。您将学习如何&#xff1a; 在网络上设置并部署您的 Cesium 应用程序。 添加全球 3D 建筑物、地形和图像的基础图层。…