浅析assert宏

浅析assert宏

文章目录

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

前言

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

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


1. 简单的断言案例

cpp 复制代码
#include <cassert>	// cpp包含的头文件

void test1()
{
	int x = 10;
	assert(x == 20);
}

运行结果:

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

2. 断言与正常错误处理

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

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

  • 忽略断言,在代码开头加上:
c++ 复制代码
#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 宏。

相关推荐
code_pgf6 小时前
C++11 / C++14 / C++17 / C++20 新特性总结
c++·c++20
魔力女仆6 小时前
分享一个 JS 鼠标跟随贪吃蛇背景库
开发语言·javascript·计算机外设
2401_894915537 小时前
GEO 搜索优化完整源码从零部署:环境配置、集群搭建全流程
开发语言·python·tcp/ip·算法·unity
麻瓜老宋8 小时前
AI开发C语言应用按步走,表达式计算器calc的第二十二步,分号赋值链式修复、TOKEN_ASSIGN
c语言·开发语言·atomcode
颜x小10 小时前
[C#] C++与c#语法对比
开发语言·c++·c#
weixin_4236521310 小时前
C#使用JObject
开发语言·c#
国科安芯10 小时前
FreeRTOS RISC-V 浮点上下文切换移植:在 IAR 工程中完整保存 FPU 寄存器
java·开发语言·单片机·嵌入式硬件·算法·系统架构·risc-v
汉克老师11 小时前
GESP2026年3月认证C++八级( 第三部分编程题(2、子图最短路)精讲
c++·最短路·floyd·gesp8级
霸道流氓气质11 小时前
Java中集成Smile 技术教程:从入门到工程实践
java·开发语言
BerrySen17812 小时前
迈向 Next-Gen Java:企业级高并发架构演进与大模型 Agent 落地深度实战
java·开发语言·架构