嵌入式驱动学习第二周——断言机制

news2024/11/25 3:07:35

前言

   这篇博客来聊一聊C/C++的断言机制。

   嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程,未来预计四个月将高强度更新本专栏,喜欢的可以关注本博主并订阅本专栏,一起讨论一起学习。现在关注就是老粉啦!

目录

  • 前言
  • 1. 断言介绍
    • 1.1 断言的概念
    • 1.2 断言的实现
    • 1.3 禁用断言
  • 2. 静态断言
    • 2.1 使用案例
    • 2.2 优点
  • 3. 运行时断言
    • 3.1 assert使用
    • 3.2 assert注意事项
  • 参考资料

1. 断言介绍

1.1 断言的概念

   断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。

   断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。

   最终用户在遇到问题时可以重新起用断言。它可以快速发现并定位软件问题,同时对系统错误进行自动报警。断言可以对在系统中隐藏很深,用其它手段极难发现的问题可以用断言来进行定位,从而缩短软件问题定位时间,提高系统的可测性。

   断言的本质就是if ... else ...判断:

if (假设为true) {
	程序正常运行;
} else {
	报错并终止程序
}

   那为什么还要断言呢?如果全是if ... else... 的话就会有无数个if语句,甚至可能一个if语句的作用阈从文件头到文件尾。并且使用断言的时机,大部分都是偶然事件,只是要验证的假设,仅仅想测试一下最坏的情况是否发生。

   除此以外,断言的assert()宏只有Debug版本才有效,Release中则被忽略。

1.2 断言的实现

   在使用断言时,需要添加头文件:#include <assert.h>

   断言是assert(expression),这是一个!!!!

void assert( int expression );

   assert计算表达式,如果值为假,那么先想stderr打印一条错误信息,然后调用abort来终止程序运行。

1.3 禁用断言

   调试结束后,可以在#include语句之前插入#define NDEBUG来禁用assert调用:

#define NDEBUG 
#include <assert.h>

2. 静态断言

2.1 使用案例

   静态断言主要是用来约束程序在编译时要满足的一定要求,是在c++11中引入的。

   其定义如下所示:

static_assert(常量表达式,提示字符串);

   如果第一个参数常量表达式的值为真(true或者非零值),那么static_assert不做任何事情,就像它不存在一样,否则会产生一条编译错误,错误位置就是该static_assert语句所在行。错误提示就是第二个参数提示字符串

#include <assert.h>

int main(void) {
	static_assert(false, "This is an error");

	return 0;
}

   在IDE中就会报错提示。并且下面的错误提示就是后面自己写的错误提示。

在这里插入图片描述

在这里插入图片描述

2.2 优点

1、使用static_assert,我们可以在编译期间发现更多的错误,提前找出错误的原因。
  
2、static_assert可以用在全局作用域中,命名空间中,类作用域中,函数作用域中,几乎可以不受限制的使用。
  
3、编译器在遇到一个static_assert语句时,通常立刻将其第一个参数作为常量表达式进行演算,但如果该常量表达式依赖于某些模板参数,则延迟到模板实例化时再进行演算,这就让检查模板参数成为了可能。
  
4、由于之前有望加入C++0x标准的concepts提案最终被否决了,因此对于检查模板参数是否符合期望的重任,就要靠static_assert来完成了,所以如何构造适当的常量表达式,将是一个值得探讨的话题。
  
5、性能方面,由于是static_assert编译期间断言,不生成目标代码,因此static_assert不会造成任何运行期性能损失

3. 运行时断言

3.1 assert使用

   运行时断言可以在程序运行过程中,判断一些支持程序正常运行的假设性条件是否满足。

   上面1.3中的assert宏就是动态断言

3.2 assert注意事项

   可以在函数开始处检验传入参数的合法性

int readNum(int n) {
	assert(n > 0);

	return 1;
}

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

// 不要写成这样
assert(n > 0 && n < maxBound);
// 最好写成这样
assert(n > 0);
assert(n < maxBound);

   不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题

// 不要写成这样
assert(i++ > 10);      
// 最好写成这样
assert(i > 10);
i++;

   assert和后面的语句应空一行,以形成逻辑和视觉上的一致感

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

参考资料

[1] C语言之断言的一些理解

[2] c++11中静态断言static_assert

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

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

相关文章

沉浸式翻译——当翻译插件遇上ChatGPT

最近发现一款超好用的翻译插件——沉浸式翻译&#xff0c;强烈推荐!* 二话不说&#xff0c;先上效果: 翻译前 翻译后: 好评如潮: 如何安装: 1、找到插件地址并安装 其它浏览器请行查找&#xff01; 2、安装完后&#xff0c;会显示这个图标 (安装后会显示 Pro 会员页面&#xf…

MQL5学习之简单移动平均线MA的编写

昨天还是有点高估自己了&#xff0c;MACD相对较难一点&#xff0c;改学MA的编写&#xff0c;首先明确MA的计算&#xff0c;假如有4个值&#xff0c;p[1&#xff0c;2&#xff0c; 3&#xff0c; 4], period3, 则v[0]p[0], v[1]p[1],v[2](p[0]p[1]p[2])/32, v[3](v[2]*3p[3]-p…

xss.haozi.me:0x08

</style ><script> alert(1)</script>

商业运作之流量之谜,粉丝增长100%

从业13年工作需要才写了这个博客&#xff0c;13年累计粉丝15个&#xff0c;哈哈我是不是太佛系了&#xff1f; 如今走上了创业之路偶尔也会遇到一些技术难题&#xff0c;我都会把解决问题的思路和方法同步到博客&#xff0c;没想到短短半年粉丝从15增长到了30。之前我并没有认…

谷歌新一代Gemini 1.5多模态模型, 最长可达100万token上下文窗口

Google在人工智能领域已经发布了自己的Gemini大模型&#xff0c;其Gemini模型是一个多模态模型&#xff0c;不仅可以支持文字输入&#xff0c;还支持图片输入。而在Gemini ultra发布不久&#xff0c;Gemini 1.5大模型也相继发布。Gemini 1.5在多个维度上都有了显著的改进&#…

Shell管道和过滤器

一、Shell管道 Shell 还有一种功能&#xff0c;就是可以将两个或者多个命令&#xff08;程序或者进程&#xff09;连接到一起&#xff0c;把一个命令的输出作为下一个命令的输入&#xff0c;以这种方式连接的两个或者多个命令就形成了管道&#xff08;pipe&#xff09;。 重定…

模拟算法题练习(一)(扫雷,灌溉,回文日期)

目录 模拟算法介绍&#xff1a; &#xff08;一、扫雷&#xff09; &#xff08;二、灌溉&#xff09; &#xff08;三、回文日期&#xff09; 有一说一这题大佬的题解是真的强 模拟算法介绍&#xff1a; 模拟算法通过模拟实际情况来解决问题&#xff0c;一般容易理解但是实…

探索Linux世界:初次接触和基本指令(文件操作)

文章目录 1.基本介绍和准备2.基本指令和Linux的基本操作3.几个重要基本指令3.1 ls - 列出文件和目录3.1.1文件的知识3.1.2 .和..文件 3.2pwd - 显示当前工作目录3.2.1路径知识 3.3 cd - 切换目录3.4 touch - 创建文件或更新时间戳3.5mkdir - 创建新目录3.6rm - 删除文件或目录3…

22.基于springboot + vue实现的前后端分离-汽车票网上预定系统(项目 + 论文PPT)

项目介绍 系统是一个B/S模式系统&#xff0c;采用Spring Boot框架&#xff0c;MySQL 数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得汽车票网上预订系统管理工作系统化、规范化。本系统的使用使管理人…

解决prettier 报错 Delete `␍`

根目录&#xff08;么有的话&#xff09;新建 .prettierrc.js配置文件 module.exports {tabWidth: 2,semi: true,printWith: 80,singleQuote: true,quoteProps: consistent,htmlWhitespaceSensitivity: strict,vueIndentScriptAndStyle: true,// 主要是最后一行endOfLine:aut…

【Quarto】Markdown导出PPT

title: “Quarto Basics” mainfont: “LXGW WenKai Mono” format: revealjs: theme: default incremental: true pptx: incremental: true html: code-fold: true beamer: incremental: true aspectratio: 169 QUARTO 这段代码是一个 YAML 头部&#xff08;front matter&…

解决NENU研究生教务系统网站“不能创建对象”等兼容性问题

本问题由吴越洋同学首先解决&#xff0c;在阅读了吴越洋同学的博客和他编写的Tempermonkey插件脚本代码后&#xff0c;完成了本项目。 吴越洋同学的博客地址为修复NENU教务系统“不能创建对象”等兼容性问题 - YorkWus Blog 吴越洋同学的插件地址为东北师范大学本科生、研究生教…

Windows10笔记本亮度调节按键失灵

操作&#xff1a;任务管理器 -> 监视器 -> 右键点击 -> 通用即插即用监视器 -> 更新驱动程序 -> 浏览我的电脑以查找我的驱动程序 -> 让我从计算机上的可用驱动程序列表中选取 -> 点击通用即插即用监视器 -> 点击关闭 -> 重启电脑。 第一步&#x…

计算复数x的余弦值计算复数x的反余弦值cmath.cos(x)cmath.acos(x)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算复数x的余弦值 计算复数x的反余弦值 cmath.cos(x) cmath.acos(x) [太阳]选择题 请问cmath.cos(x)的作用是&#xff1a; import cmath print("【执行】cmath.cos(0)") print(cm…

2.3_5 用信号量实现互斥、同步、前驱关系

文章目录 2.3_5 用信号量实现互斥、同步、前驱关系&#xff08;一&#xff09;信号量机制实现进程互斥&#xff08;二&#xff09;信号量机制实现进程同步&#xff08;三&#xff09;信号量机制实现前驱关系 总结 2.3_5 用信号量实现互斥、同步、前驱关系 我们之前学习了进程互…

MySQL学习Day25——数据库其他调优策略

一、数据库调优的措施: 1.调优的目标: (1)尽可能节省系统资源&#xff0c;以便系统可以提供更大负荷的服务 (2)合理的结构设计和参数调整&#xff0c;以提高用户操作的响应速度 (3)减少系统的瓶颈&#xff0c;提高MySQL数据库整体的性能; 2.如何定位调优:用户的反馈、日志…

基于Springboot的无人智慧超市管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的无人智慧超市管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

微软多兴趣召回:Octopus

Octopus: Comprehensive and Elastic User Representation for the Generation of Recommendation Candidates 背景&#xff1a; 多兴趣通道(channel)结构的多兴趣召回模型在兴趣通道数量上面存在两个问题 兴趣通道较少&#xff0c;不能充分学习到用户的多个兴趣。兴趣通道较…

力扣hot9---滑动窗口

题目&#xff1a; 先记录一下&#xff08;没想到有生之年&#xff0c;还能&#xff09;&#xff1a;其实还能优化&#xff0c;后面会讲述优化思路 思路&#xff1a; 滑动窗口的大小就是固定的&#xff0c;就是len_p。那么依次将窗口从s的最左端向右滑动。在当下的窗口中&#x…

鸿蒙开发就业前景以及发展方向分析~

鸿蒙操作系统作为华为公司自主研发的操作系统&#xff0c;已经成为当下炙手可热的话题。作为一个全新的操作系统&#xff0c;鸿蒙开发为IT行业带来了巨大的就业机会。本文将围绕鸿蒙开发的就业前景以及发展方向展开讨论。 一、鸿蒙开发就业前景 随着鸿蒙操作系统的发布&#…