【C语言进阶篇】assert宏 使用详解

文章目录

一、assert简介

二、assert使用方法和规则

2.1 头文件

2.2 原型

2.3 功能

2.4 示例

 2.5 assert的打开与关闭

三、注意事项

3.1 运行效率问题

3.2 assert只适用于调试版本

3.3 资源释放与清理

3.4 过度依赖

四、总结


        个人主页:    倔强的石头的博客

        系列专栏 C语言指南         C语言刷题系列      

一、assert简介

 assert是一个在C语言中用于调试的 ,用于在运行时确保程序符合指定条件,如果不符合,就报错终止运行。这个宏常常被称为“断言”

二、assert使用方法和规则

2.1 头文件

注意:assert是宏,而不是函数。在C的assert.h头文件中。

2.2 原型

​assert(表达式);
#include <assert.h>
assert(expression);

2.3 功能

assert() 宏接受⼀个表达式作为参数。

如果该表达式为真(返回值非零), assert() 不会产生任何作用,程序继续运行;

如果该表达式为假(返回值为零), assert() 就会报错,在标准错误流 stderr 中写入⼀条错误信息,显示没有通过的表达式,以及包含这个表达式的⽂件名和行号。(而这也正是使用assert的优势,它能自动标识文件和出问题的行号)

2.4 示例

比如在下面这段代码中设置了两个assert语句

#include<stdio.h>
#include<assert.h>
int main()
{int a = 10;int* p1 = &a;assert(p1 != NULL);//表达式为真,assert不执行int* p2 = NULL;assert(p2 != NULL);//表达式为假,assert执行,程序崩溃return 0;
}

执行第一条assert语句,表达式为真,assert不执行

执行第二条assert语句,表达式为假,assert执行,程序崩溃

并且会在标准错误流中输出错误的语句和行号

 2.5 assert的打开与关闭

assert的关闭

如果已经确认程序没有问题,不需要再做断⾔,就在 #include <assert.h> 语句的前⾯,定义⼀个宏 NDEBUG 。然后,重新编译程序,编译器就会禁⽤⽂件中所有的 assert() 语句。
 

#define NDEBUG
#include<stdio.h>
#include<assert.h>
int main()
{int a = 10;int* p1 = &a;assert(p1 != NULL);int* p2 = NULL;assert(p2 != NULL);//即使表达式为假,assert也不会执行return 0;
}

 

assert的重新启用

 如果程序又出现问题,可以移除这条 #define NDBUG 指令(或者把它注释掉),再次编译,这样就重新启用了 assert() 语句。

 

三、注意事项

3.1 运行效率问题

由于assert引入了额外的检查,降低了程序运行效率,如果上述一段代码拿到编译器中运行就会发现运行时间大大增加,并且过度使用可能降低代码可读性和维护性,应在必要时谨慎使用。

3.2 assert只适用于调试版本

assert`仅适用于开发和测试阶段在发布版本中通常需要移除或者替换为更完整的错误处理机制,因为它不能提供用户友好的错误提示,且会导致程序直接崩溃。

一般在当前的集成开发环境,在 Release 版本中,直接就是优化掉了。这样在debug版本写有利于程序员排查问题,在 Release 版本不影响用户使用时程序的效率。

3.3 资源释放与清理

由于assert通常会导致程序立即终止,它可能无法完成必要的资源释放与清理工作,尤其是在涉及到内存管理等场景时,可能导致资源泄露等问题。

 

3.4 过度依赖

过度使用assert可能导致代码逻辑过分依赖于开发阶段的检查,而忽略了对异常情况的实际处理,使得代码在release模式下可能出现意料之外的行为。

四、总结

assert是一个强大的调试工具,可以大大提高程序开发效率,但在实际项目中应根据实际情况合理使用,并结合其他健壮的错误处理机制以确保程序在所有环境下的稳定性和可靠性。

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

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

相关文章

API横向越权修复之ID加密

横向越权 横向越权一般发生在应用系统做了【认证】&#xff0c;但没有做【鉴权】的情况下&#xff0c;也是最常见的漏洞之一。 认证&#xff1a;即识别是否有权限访问系统&#xff1b;鉴权&#xff1a;即识别在系统中的权限是什么&#xff1b; 例如&#xff1a; // 访问某…

氢气传感器报警值:守护实验室安全的隐形卫士

随着科技的发展&#xff0c;我们的生活变得越来越便捷&#xff0c;但是与此同时&#xff0c;安全问题也日益凸显。其中&#xff0c;氢气作为一种清洁能源&#xff0c;被广泛应用于各个领域&#xff0c;但是如果不加以控制&#xff0c;氢气泄漏也可能带来严重的安全隐患。因此&a…

柔性电流探头方向判断有哪些方法?干货分享!

柔性电流探头方向判断的方法干货分享&#xff01;从理论到实践&#xff0c;助您成为专业人士&#xff01;干货收藏&#xff0c;快看起来吧&#xff01;      柔性电流探头方向判断一直是电力行业测试中的关键问题之一&#xff0c;确切地判断电流方向对于测试电力系统的稳定…

Docker部署xxl-job调度器并结合SpringBoot测试

文章目录 一、Docker部署1. 创建数据库2. 启动容器3. 访问4. 新建执行器 二、SpringBoot整合1. 模块注册到执行器2. 创建配置类3. 启动测试 三、任务发布-普通任务1. 编写任务代码2. 创建任务3. 启动任务 四、任务发布-分片任务1. 编写任务代码2. 启动多个实例3. 创建任务4. 启…

MYSQL Case When搜索查询

Case When可以用作select语句中的搜索&#xff0c;如果满足条件&#xff0c;就给字段附上结果值。 语法&#xff1a; CASE WHEN 表达式1 THEN 结果1 WHEN 表达式2 THEN 结果2WHEN 表达式3 THEN 结果3ELSE 其他结果 END简单的例子&#xff1a; 当学生表tb_student里&#xff…

CTF特训(二):青少年CTF-MISC部分WP

FLAG&#xff1a;当觉得自己很菜的时候&#xff0c;就静下心来学习 专研方向:MISC&#xff0c;CTF 每日emo&#xff1a;听一千遍反方向的钟&#xff0c;我们能回到过去吗&#xff1f; CTF特训(二)&#xff1a;青少年CTF-MISC部分WP&#xff1a; 文章目录 CTF特训(二)&#xff1…

IDEA开发使用 thymeleaf 模板$表达式报红波浪线解决方案

系列文章目录 文章目录 系列文章目录后端存值前端取值thymeleaf 后端存值 RequestMapping("/testModelAndView")//使用ModelAndView时返回的方法类型必须是ModelAndViewpublic ModelAndView testModelAndView() {//创建ModelAndView对象ModelAndView mav new Model…

QT播放gstreamer命令(三)---使用QMediaPlayer

前文&#xff1a; 因为之前听说过&#xff0c;QMediaPlayer已经集成了gstreamer&#xff0c;但是并没有什么接口来例子来说明&#xff0c;根本看不出来有任何gstreamer的形式&#xff0c;于是在QT5助手里面搜了一下&#xff0c;发现确实有gstreamer的痕迹&#xff0c;但是例子写…

vue中template原理

在Vue中&#xff0c;template具有非常重要的作用&#xff0c;它能将数据渲染到用户界面上&#xff0c;达到我们所预想的效果。Vue的template是基于类似于html的语法&#xff0c;但是它还有一些独特的规则。在Vue中&#xff0c;template语法会被转换成虚拟DOM&#xff0c;在和Vu…

谷歌浏览器网站打不开,显示叹号

问题&#xff1a; 您与此网站之间建立的连接不安全请勿在此网站上输入任何敏感信息&#xff08;例如密码或信用卡信息&#xff09;&#xff0c;因为攻击者可能会盗取这些信息。 了解详情 解决方式&#xff1a; 网上有很多原因&#xff0c;亲测为DNS问题&#xff0c;设置&…

Qt之窗口位置

Qt提供了很多关于获取窗体位置及显示区域大小的函数&#xff0c;如x&#xff08;&#xff09;&#xff0c;y()和pos()&#xff0c;rect()&#xff0c;size()&#xff0c;geometry()等&#xff0c;统称为"位置相关函数"或"位置函数"。几种主要位置函数及其之…

82.1W/S的QPS到底大不大?

QPS&#xff0c;全称是Query Per Second&#xff0c;即每秒查询次数。它是一种衡量系统处理能力的重要指标。"每秒1万"的QPS对于一般的个人网站或者中小型网站来说&#xff0c;是相当高的。但是对于大型网站、互联网公司或高并发系统来说&#xff0c;可能就略显不足。…

第0章 Linux 基础入门

第0章 Linux 基础入门 RHCSA Red Hat Certified System Administrator 红帽认证系统管理员。 什么是计算机 计算机的组成&#xff1a; 控制器 运算器 存储器 输出设备 输入设备 计算机只能识别0和1&#xff0c;也就是二进制数。 为什么要学习Linux Linux 因其高效率…

Python||五城P.M.2.5数据分析与可视化_使用华夫图分析各个城市的情况(上)

目录 五城P.M.2.5数据分析与可视化——北京市、上海市、广州市、沈阳市、成都市&#xff0c;使用华夫图分析各个城市的情况 1.北京市的空气质量 2.广州市的空气质量 【上海市和成都市空气质量情况详见下期】 五城P.M.2.5数据分析与可视化——北京市、上海市、广州市、沈阳市、成…

重发布

一&#xff1a;作用 在两种路由协议之间&#xff0c;或者一个协议的不同进程之间&#xff0c;借助ASBR &#xff08;同时工作在两种协议或 者协 议的不同进程中&#xff09;学习到两个网络的路由信息&#xff0c;并且通过重发布进行路由共享&#xff0c;最终实现全网可 达。…

在mysql中我有一列字段,字段类型是Decimal,保留了2位小数,我想过滤这2位小数中不为0的数字,如何过滤呢?

直接看SQL如何实现 SELECT * FROM your_table_name WHERE amount - FLOOR(amount) > 0;解释 这里的FLOOR(amount)函数会返回amount的整数部分&#xff0c;amount - FLOOR(amount)就会得到小数部分。如果小数部分大于0&#xff0c;表示这个数字的小数部分不为0 扩展 如果…

大模型实践笔记(1)——GLM-6B实践

目录 在Ubuntu上的配置Git Large File Storage 安装Git LFS&#xff1a; 设置Git LFS&#xff1a; 使用Git LFS&#xff1a; 安装GLM-6B 环境依赖 ChatGLM2-6B介绍 配置GLM 下载代码 构建环境 安装依赖 本地部署 网页UI 很多模型在hugging face上面&#xff0c;…

知识库系统为什么优秀企业都必备?这篇文章告诉你

在今天的商业世界中&#xff0c;知识就是力量。企业里的每一个小小的灵感、想法、经验&#xff0c;都可能是推动业务增长的源泉。那么&#xff0c;如何系统地管理和使用这些宝贵的知识资源呢&#xff1f;答案就是——知识库系统。 那么&#xff0c;什么是知识库系统呢&#xf…

六、Nacos源码系列:Nacos健康检查

目录 一、简介 二、健康检查流程 2.1、健康检查 2.2、客户端释放连接事件 2.3、客户端断开连接事件 2.4、小结 2.5、总结图 三、服务剔除 一、简介 Nacos作为注册中心不止提供了服务注册和服务发现的功能&#xff0c;还提供了服务可用性检测的功能&#xff0c;在Nacos…

货车运输(树)

[NOIP2013 提高组] 货车运输 题目背景 NOIP2013 提高组 D1T3 题目描述 A 国有 n n n 座城市&#xff0c;编号从 1 1 1 到 n n n&#xff0c;城市之间有 m m m 条双向道路。每一条道路对车辆都有重量限制&#xff0c;简称限重。 现在有 q q q 辆货车在运输货物&#x…