当前位置: 首页 > news >正文

【C语言】assert.h——断言


文章目录

      • 主要内容
      • 调试和发布模式
      • 使用示例
      • 用法总结与注意事项


断言是一种用于在程序执行过程中进行调试的工具,能够帮助开发者验证程序的某些假设是否为真。如果断言失败,程序会终止,并输出一个错误消息,通常包含出错的文件名和行号。这对于调试和测试非常有帮助。

主要内容

assert是一个宏,并不是函数。assert 宏接受一个表达式作为参数,如果该表达式的值为假(0),它会:

  1. 打印一条错误信息,指出断言失败的表达式,以及出错的文件名和行号。
  2. 调用 abort 函数终止程序执行。

具体的实现可以简单概括如下:

#define assert(expression) ((expression) ? (void)0 : __assert_fail(#expression, __FILE__, __LINE__))void __assert_fail(const char *expr, const char *file, int line) {fprintf(stderr, "Assertion failed: (%s), file %s, line %d.\\n", expr, file, line);abort();
}
/*助于理解 assert 功能
*/

调试和发布模式

在调试模式下,断言可以帮助捕捉程序中的错误。而在发布模式下,通常会禁用断言,以提高程序性能。可以通过定义 NDEBUG 宏来禁用断言:

#define NDEBUG    // 使用时一定要在包含assert库函数前定义
#include <assert.h>

一旦定义了 NDEBUGassert 宏将被定义为空操作,不会进行任何检查或中断程序:

#ifdef NDEBUG
#define assert(expression) ((void)0)
#else
#define assert(expression) ((expression) ? (void)0 : __assert_fail(#expression, __FILE__, __LINE__))
#endif

使用示例

#include <stdio.h>
#include <assert.h>int main() {int x = 5;assert(x == 5);  // 断言成功,不会中断程序printf("x is 5\n");x = 3;assert(x == 5);  // 断言失败,程序终止printf("This line will not be executed.\n");return 0;
}/*在这个示例中,第一次断言 x == 5 是成功的,程序继续执行并输出 "x is 5"。第二次断言 x == 5 失败,程序会终止并输出错误信息。
*/

用法总结与注意事项

  1. 每个assert只检验一个条件:同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败

  2. 有的地方,assert不能代替条件过滤

  3. 只用于调试:断言主要用于调试阶段,确保代码逻辑的正确性。在发布版本中,通常会禁用断言,因此不要依赖断言来处理运行时错误或进行关键性检查。

  4. 不要在断言中有副作用:断言表达式中不应包含会改变程序状态的操作。

    // 错误示例
    assert(free(ptr) == 0);  // 这样写会导致发布版本中 free 函数不执行/* 例如,不要在断言中进行函数调用或修改变量的操作,因为在发布版本中这些操作可能不会执行。 */
    
  5. 条件表达式要简单明确:断言的条件表达式应简单明了,确保容易理解和调试。复杂的表达式可能会导致调试困难。

  6. 不要在生产代码中依赖断言:断言不应替代常规的错误处理机制。对于需要在生产环境中处理的错误,应使用适当的错误处理代码(如 if 语句和错误码)。

  7. 正确使用 NDEBUG 宏:在发布版本中,通过定义 NDEBUG 宏来禁用断言。这可以在编译选项中定义,或在源代码中定义:

    #define NDEBUG
    #include <assert.h>
    
  8. 避免在性能关键的代码中使用断言:虽然断言在调试阶段很有帮助,但在性能关键的代码路径中使用断言可能会影响调试阶段的性能。可以在调试阶段临时移除或减少这些断言,以进行性能测试。

  9. 保证断言条件的重要性:断言条件应当是真正的重要检查,而不是无关紧要的小检查。这些条件应反映代码的关键假设或不变量。

  10. 文档化断言:在复杂或关键的代码中,记录断言的目的和含义,帮助其他开发者理解断言的意图和背景。

相关文章:

【C语言】assert.h——断言

文章目录 主要内容调试和发布模式使用示例用法总结与注意事项 断言是一种用于在程序执行过程中进行调试的工具&#xff0c;能够帮助开发者验证程序的某些假设是否为真。如果断言失败&#xff0c;程序会终止&#xff0c;并输出一个错误消息&#xff0c;通常包含出错的文件名和行…...

HTML静态网页成品作业(HTML+CSS)—— 零食商城网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…...

虚函数机制-动态绑定的应用

虚函数使得程序在运行的时候根据指针指向对象的类型来确定调用哪个函数。 下图中&#xff1a;都为静态绑定。因为在编译器就确定了可以调用的函数 此时当基类指针指向派生类对象时&#xff0c;因为没有virtual关键字&#xff0c;所以在编译阶段就根据指针类型确定了要指向的函…...

MOS开关电路应用于降低静态功耗

本文主要讲述MOS开关电路的应用,过了好久突然想整理一下&#xff0c;有错误的地方请多多指出&#xff0c;在做电池类产品&#xff0c;需要控制产品的静态功耗&#xff0c;即使让芯片进入休眠状态&#xff0c;依旧功率很大&#xff0c;所以在电路中加一组软开关&#xff0c;防止…...

【每日刷题】Day65

【每日刷题】Day65 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCR 175. 计算二叉树的深度 - 力扣&#xff08;LeetCode&#xff09; 2. 序列找数_牛客题霸_牛客网…...

Oracle数据库连接并访问Microsoft SQL Server数据库

Oracle数据库连接并访问Microsoft SQL Server数据库 说明&#xff1a;  1.实际开发中&#xff0c;Oracle数据库与SQLServer数据库之间可能需要相互进行访问&#xff0c;方便业务数据抽取&#xff0c;编写视图及表等操作。  2.SQLServer访问Oracle数据库配置相对较为简单&…...

SQL 入门教程

SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是一种用于管理和操作关系数据库管理系统的编程语言。它被设计用来查询、更新、插入和删除数据库中的数据。SQL是一种标准化的语言&#xff0c;尽管在不同的数据库系统中可能存在一些差异&…...

Java—装饰器模式

介绍 装饰器模式 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你动态地将行为添加到现有的对象中&#xff0c;而无需修改其代码。装饰器模式提供了比继承更灵活的功能扩展方式。 主要角色 Component&#xff1a;定义一个对…...

服务器远程桌面经常连接不上,造成远程桌面连接不上的原因都有哪些

服务器远程桌面连接不稳定或经常连接不上是一个较为常见的技术问题&#xff0c;其可能的原因涉及多个层面&#xff0c;包括网络设置、服务器配置、系统安全等方面。下面将详细探讨一些可能造成远程桌面连接问题的主要原因&#xff1a; 首先&#xff0c;网络连接不稳定是导致远…...

C#|Maui|BootstrapBlazor|Bootstrap Blazor 组件库改模板 | Bootstrap Blazor 组件库改布局,该怎么改?

先copy一个项目下来&#xff1a;Bootstrap Blazor 组件库 一套基于 Bootstrap 和 Blazor 的企业级组件库 发现不是很满足我的需求&#xff0c;我要把右下角的admin移动到左边去&#xff0c;该怎么移动&#xff1f; 先改代码 点进去到Layout.razor 文档&#xff0c;改成如下&am…...

【Linux】I/O多路复用

文章目录 I/O多路复用select()select()缺点 poll()poll()缺点 epoll()LT(水平触发模式)ET(边缘触发模式)具体函数 I/O多路复用 多进程和多线程实现并发会消耗大量的资源&#xff0c;主进程/线程用于监听和接受连接&#xff0c;再创建多个子进程/子线程来完成与连接的各个客户端…...

ubuntu20.0.4下安装PyTorch

参考文档 https://datawhalechina.github.io/thorough-pytorch/%E7%AC%AC%E4%B8%80%E7%AB%A0/1.2%20PyTorch%E7%9A%84%E5%AE%89%E8%A3%85.html 1&#xff1a;安装Anaconda 登录Anaconda | Individual Edition&#xff0c;https://www.anaconda.com/download/success &#xff…...

Android屏幕旋转流程(1)

&#xff08;1&#xff09;Gsensor的注册和监听 App -->I2C过程&#xff1a;App通过SensorManager.getSystemServer调用到SystemSensorManager&#xff0c;SystemSensorManager通过jni调用到SensorManager.cpp&#xff0c;后通过binder调用到SensorService。SensorService通…...

JS常见的运算符有哪些?

在JavaScript中&#xff0c;常见的运算符可以分为以下几类&#xff1a; 算术运算符&#xff1a; &#xff1a;加法-&#xff1a;减法*&#xff1a;乘法/&#xff1a;除法%&#xff1a;取余&#xff08;模运算&#xff09;&#xff1a;递增--&#xff1a;递减**&#xff1a;幂运…...

【scikit-learn入门指南】:机器学习从零开始

1. 简介 scikit-learn是一款用于数据挖掘和数据分析的简单高效的工具&#xff0c;基于NumPy、SciPy和Matplotlib构建。它能够进行各种机器学习任务&#xff0c;如分类、回归和聚类。 2. 安装scikit-learn 在开始使用scikit-learn之前&#xff0c;需要确保已经安装了scikit-le…...

MEMS:Lecture 17 Noise MDS

讲义 Minimum Detectable Signal (MDS) Minimum Detectable Signal&#xff08;最小可检测信号&#xff09;是指当信号-噪声比&#xff08;Signal-to-Noise Ratio, SNR&#xff09;等于1时的输入信号水平。简单来说&#xff0c;MDS 是一个系统能够分辨出信号存在的最低输入信号…...

Windows运维:找到指定端口的服务

运维过windows的或多或少都遇到过需要找到一个端口对应的服务&#xff0c;或者是因为端口占用&#xff0c;或者是想看下对应的服务是哪个&#xff0c;那么如何操作呢&#xff1f;看看本文吧。 1、按照端口找到进程ID 例如想找8000端口的进程ID netstat -ano | findstr :8000 2…...

Linux文件系统讲解!

一、Linux文件系统历史 1、在早期的时候Linux各种不同发行版拥有自己各自自定义的文件系统层级结构。 2、当我用Red hat转向玩Debian时&#xff0c;我进入/etc我都是懵的。 3、后来Linux社区做了一个标准、FHS&#xff08;文件系统标准层次结构&#xff09;。来帮助Linux系统的…...

mysql集群,两主两从,使用mysql-proxy实现读写分离

主从复制 一、IP规划 服务器IP备注master1192.168.100.131master2的从master2192.168.100.132master1的从slave1192.168.100.134slave1的从slave2192.168.100.135slave2的从mysql-proxy192.168.100.137 二、具体配置 1.master1 ​ 配置ip&#xff1a;192.168.100.131 ​ …...

Linux文本处理三剑客+正则表达式

Linux文本处理常用的3个命令&#xff0c;脚本或者文本处理任务中会用到。这里做个整理。 三者的功能都是处理文本&#xff0c;但侧重点各不相同&#xff0c;grep更适合单纯的查找或匹配文本&#xff0c;sed更适合编辑匹配到的文本&#xff0c;awk更适合格式化文本&#xff0c;对…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...