C++基础系列【35】巧用assert

博主介绍:程序喵大人

  • 35- 资深C/C++/Rust/Android/iOS客户端开发
  • 10年大厂工作经验
  • 嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手
  • 《C++20高级编程》《C++23高级编程》等多本书籍著译者
  • 更多原创精品文章,首发gzh,见文末
  • 👇👇记得订阅专栏,以防走丢👇👇
    😉C++基础系列专栏
    😃C语言基础系列专栏
    🤣C++大佬养成攻略专栏
    🤓C++训练营
    👉🏻个人网站

C/C++里,assert是一种比较常用的调试策略。

定义

assert字面意思是断言,用于判断是否满足某个条件,如果不满足某个条件,则程序会直接崩溃,控制台上会显示崩溃所在的文件名和行号。

看下它的使用:

#include <assert.h>
#include <stdio.h>void func(int a) {assert(a > 0);printf("%d", a);
}int main() { func(-1); }

示例中我用assert来表示函数func的输入一定要>0

我如果输入了-1,程序运行时会在assertcrash,同时提供了报错的详细:

a.out: test.cc:5: void func(int): Assertion `a > 0' failed.Aborted

注意事项:

我们一定在assert处只做判断,不要添加任何功能逻辑,因为assert只在debug模式下有作用release模式下,assert这行代码会自动跳过去,会自动被忽略。

assert(++i > 0);

这种改变了i状态的assert代码千万不要写,因为会导致debug模式和release模式下的行为不一致。

什么时候使用assert

期望某块逻辑一定要满足某个前置条件,如果不满足就要crash,这方便于我们在debug模式下调试程序,如果crash,方便我们进一步修复问题,使其满足assert条件。

比如我们要输出某个字符串,做一次判空其实也是耗费性能的,我们期望传进来的串一定非空,如果是空,那就直接crash

void func(const char* s) {printf("hello %s \n", s);
}

static_assert

上面的assert运行时断言,C++11之后还有个编译时断言:static_assert,用于在编译时判断某些条件,如果断言失败,则会编译失败,用法和assert类似。

#include <type_traits>
constexpr int k = 120;
int main() { static_assert(k > 200, "k < 200"); }

输出:

test.cc:8:14: error: static_assert failed due to requirement 'k > 200' "k < 200"int main() { static_assert(k > 200, "k < 200"); }
^             ~~~~~~~1 error generated

static_assert后面可以跟着一个字符串,在断言失败时,会在控制台输出此字符串,方便提示我们相关信息。

练习

  • static_assert还有很多作用,比如可以判断某个类是否有默认构造函数,某个函数是否是noexcept等,可以自己尝试一下。

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

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

相关文章

【EI检索】2025年城市设计与规划国际会议 (CoUDP 2025)

重要信息 会议网址&#xff1a;www.coudp.org 会议时间&#xff1a;2025年9月19-21日 召开地点&#xff1a;中国北京 截稿时间&#xff1a;2025年8月19日 录用通知&#xff1a;投稿后2周内 收录检索&#xff1a;Ei Compendex, SCOPUS 会议简介 2025年城市设计与规划…

《实战AI智能体》MCP对Agent有哪些好处

首先MCP为Agent提供了标准化的方式来接入各种工具和数据源,无论是本地运行的工具,例如通过stdio服务器,还是远程托管的服务HTTP over SSE服务, Agent都可以通过统一的接口与它们进行交互,极大扩展了第三方工具库。 例如,在金融领域,Agent 可以接入股票分析的MCP工具。当…

知识图谱在官网中的本质与部署逻辑

知识图谱在官网中的本质与部署逻辑 ​1. 知识图谱不是独立页面&#xff0c;而是智能化基础设施 知识图谱的最终形态并非一个可见的“图谱页面”&#xff0c;而是渗透在官网各交互模块的AI能力引擎&#xff0c;其核心作用在于&#xff1a; ​后台&#xff1a;构建实体关系网络…

蓝桥杯冲刺

例题1&#xff1a;握手问题 方法1&#xff1a;数学推理(简单粗暴&#xff09; 方法2&#xff1a;用代码实现方法1 #include<iostream> using namespace std; int main() {int result 0;for (int i 1; i < 49; i){for (int j i 1; j < 50; j){//第i个人与第j个…

如何在服务器里备份文件或系统

当我们在企业里&#xff0c;备份文件或者系统是需要经常做的&#xff0c;当我们服务器系统崩溃了或者损坏了&#xff0c;或者我们的存放的工作需求的文件夹损坏丢失&#xff0c;这时候如何我们提前备份了就可以快速回复。 那接下来我们直接上实操&#xff0c;接下来操作是在虚…

Qt实现点击按钮弹出侧边框(可用于登录界面)

Qt实现点击按钮弹出侧边框 1、创建界面2、封面按钮实现2.1 连接信号与槽2.2固定封面按钮、侧边框及各个标签位置和顶层显示封面按钮2.3创建侧边框状态并在初始化列表中初始化2.4 侧边框动画效果实现 3、视频演示效果4、总结 1、创建界面 封面按钮样式表 QPushButton { border…

SQL WHERE 与 HAVING

WHERE 和 HAVING 都是 SQL 中用于筛选数据的子句&#xff0c;但它们有重要的区别 WHERE 子句 在 分组前 过滤数据 作用于 原始数据行 不能使用聚合函数 执行效率通常比 HAVING 高 SELECT column1, column2 FROM table WHERE condition; HAVING 子句 在 分组后 过滤数据 …

表格数据导出为Excel

环境及插件配置&#xff1a;&#xff08;理论上vue2应该也可以使用&#xff0c;没有试验过&#xff09; "vue": "^3.2.36", "webpack": "^5.94.0", "webpack-cli": "^5.1.4", "file-saver": "^2.…

Photoshop 2025 Mac中文 Ps图像编辑软件

Photoshop 2025 Mac中文 Ps图像编辑软件 文章目录 Photoshop 2025 Mac中文 Ps图像编辑软件一、介绍二、效果三、下载 一、介绍 Adobe Photoshop 2025 Mac版集成了多种强大的图像编辑、处理和创作功能。①强化了Adobe Sensei AI的应用&#xff0c;通过智能抠图、自动修复、图像…

rust Send Sync 以及对象安全和对象不安全

开头&#xff1a;菜鸟小明的疑惑 小明&#xff1a; “李哥&#xff0c;我最近学 Rust&#xff0c;感觉它超级严谨&#xff0c;啥 Send、Sync、对象安全、静态分发、动态分发的&#xff0c;我都搞晕了&#xff01;为啥 Rust 要设计得这么复杂啊&#xff1f;” 小李&#xff0…

JAVA:利用 JSONPath 操作JSON数据的技术指南

1、简述 JSONPath 是一种强大的工具&#xff0c;用于查询和操作 JSON 数据。类似于 SQL 的语法&#xff0c;它为处理复杂的 JSON 数据结构提供了简单且高效的解决方案。✨ 代码样例&#xff1a;https://gitee.com/lhdxhl/springboot-example.git 本文将介绍 JSONPath 的基本…

服务器磁盘卷组缓存cache设置介绍

工具1&#xff1a; storcli a. 确认软件包是否安装 [rootlocalhost ~]#rpm -qa | grep storcli storcli-1.21.06-1.noarch 备注&#xff1a;若检索结果为空&#xff0c;需要安装对应的软件安装包。安装命令如下&#xff1a; #rpm -ivh storcli-xx-xx-1.noarch.rpm b. 查看逻辑…

java项目分享-分布式电商项目附软件链接

今天来分享一下github上最热门的开源电商项目安装部署&#xff0c;star 12.2k&#xff0c;自行安装部署历时两天&#xff0c;看了这篇文章快的话半天搞定&#xff01;该踩的坑都踩完了&#xff0c;软件也打包好了就差喂嘴里。 项目简介 mall-swarm是一套微服务商城系统&#xf…

QtWebApp使用

QtWebApp 是一个轻量级的 HTTP 服务器库,基于 Qt 网络模块(QTcpServer 和 QTcpSocket)实现,适用于嵌入式设备、本地服务或需要快速搭建 Web 接口的 Qt 应用程序。 1. 核心功能 HTTP/1.1 服务器 支持 GET、POST、PUT、DELETE 等标准 HTTP 方法。 解析请求头、查询参数(Qu…

用Rust和WebAssembly打造轻量级前端加密工具

开头聊两句 最近在折腾前端项目时&#xff0c;发现一个问题&#xff1a;很多时候需要在浏览器里做点加密作&#xff0c;比如保护用户输入的数据&#xff0c;但JavaScript跑起来总感觉慢吞吞的。于是我开始琢磨&#xff0c;能不能用Rust写个高性能的加密模块&#xff0c;再通过W…

Linux NUC小主机化身视频会议服务器: 技术优势与部署实战

在远程办公常态化背景下&#xff0c;视频会议系统对硬件的轻量化、低功耗与稳定性提出了更高要求。基于Intel NUC&#xff08;Next Unit of Computing&#xff09;打造的Linux服务器方案&#xff0c;凭借其高性能、低能耗和可扩展性优势&#xff0c;正成为中小企业搭建视频会议…

idea查看class字节码

概述 如何查看class字节码&#xff1f;话不多说&#xff0c;直接看示例&#xff01; 方法一 选中class类&#xff0c;然后选择 View -> Show Bytecode 方法二 安装jclasslib插件 方法三 Settings -> Tools -> External Tools 添加一个tool //指定javap.exe路…

python使用cookie、session、selenium实现网站登录(爬取信息)

一、使用cookie 这段代码演示了如何使用Python的urllib和http.cookiejar模块来实现网站的模拟登录&#xff0c;并在登录后访问需要认证的页面。 # 导入必要的库 import requests from urllib import request, parse# 1. 导入http.cookiejar模块中的CookieJar类&#xff0c;用…

机器人基础知识-1

1.六轴机器人中的六轴是什么&#xff1f; 第一轴&#xff08;J1&#xff09;&#xff1a;底座旋转 控制机器人整体绕垂直轴旋转&#xff08;左右摆动&#xff09;&#xff0c;决定工作范围的水平方向。 第二轴&#xff08;J2&#xff09;&#xff1a;下臂前后摆动 驱动机器人的…

将代理连接到 Elasticsearch 使用模型上下文协议

作者&#xff1a;来自 Elastic Jedr Blaszyk 及 Joe McElroy 让我们使用 Model Context Protocol 服务器 与 你的 数据 在 Elasticsearch 中聊天。 如果与你的数据交互像与同事聊天一样轻松&#xff0c;会怎样&#xff1f;想象一下&#xff0c;你只需简单地问&#xff1a;“显…