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

2024-03-05 03:52

本文主要是介绍嵌入式驱动学习第二周——断言机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

   这篇博客来聊一聊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.chinasem.cn/article/775255

相关文章

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

Redis的持久化之RDB和AOF机制详解

《Redis的持久化之RDB和AOF机制详解》:本文主要介绍Redis的持久化之RDB和AOF机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述RDB(Redis Database)核心原理触发方式手动触发自动触发AOF(Append-Only File)核

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg