当前栏目
聊聊预编译#Error的使用,你学会了吗?
引言
说到预编译,大家立刻就能想到#define、#if、#ifdef和#ifndef等熟悉的预编译命令。其实#include,我们通常放在源文件用来包含头文件,它也是预编译命令。当然这不是这篇文章的重点。
这篇文章主要讲解下#error预编译命令,对于什么是预编译,预编译的作用等基础知识点不再讲解,不懂的同学请自行百度。
在MCU的开发中,我们经常需要用到Flash存储一些参数,且通常情况下有很多参数需要存储。
一般采用一个扇区存储一种类型的参数(可能造成Flash空间浪费),但对于一些内部Flash容量很大的MCU,这样做也是可行的。
示例demo如下:
很多开发工程师喜欢这样做,如果参数少时还好,当有很多参数时,这将是一个噩梦。如果这些参数分散在各个文件中,阅读这份源码将是恶心他妈给恶心开门,恶心到家了。
当想增加一个参数存储时,如果不很熟悉代码,根本不知道哪个扇区是空闲的。
优化版本如下,将这这些宏定义统一定义在flashmap.h中。
相信大家也看出来了,这样管理参数地址,就显得很合理,不会想增加一个参数时,不知道哪个扇区是空闲的,找到了一个扇区,还是担心受怕,害怕和别的参数存储地址冲突将其覆盖。
当然它也有弊端,如果问你PARA_ETH_ADDR存储地址,并不能立刻从代码中看出,这个问题,我一般使用printf打印出来。
还有个问题,如果加了很多参数,最后一个参数地址大于Flash空间怎么办,或者软件设计一段Flash空间作为参数区,不被允许超过这个地址。
在这个代码结构中,无法从代码中直接获取,有不行使用printf肉眼判断,那么可以使用#error 解决这个问题。
#error
#error 是一种预编译器指示字,用于生成一个编译错误消息 。
用法:#error [message] //message为用户自定义的错误提示信息,可缺省。
#error 可用于提示编译条件是否满足。编译过程中的任何错误意味着无法生成最终的可执行程序。
上面的程序优化为
这样当你的参数最后地址大于0x0801E000,编译器机会报错,根本编译不过,如下图
类似的,#warning 用于生成编译警告消息。warning可用来提示一些非致命错误。
其他用法
限定宏定义的数值范围,下面SIZE被限制在0到100内。
指定使用VS编译器
判断是否定义了某个宏,比如FreeRTOS源码中
相关文章
- 为什么启动线程不直接调用run(),而要调用start(),如果调用两次start()方法会有什么后果
- 写给前端的 K8S 上手指南
- 种草两个可以画 Flowable 流程图的 Vue 库!
- 后端人眼中的Vue(一)
- 为什么Vue(默认情况下)比React性能更好
- 前端模块化的前世今生
- 对 Go2 错误处理提案的批判
- 躲不过JPA的坑之级联保存
- 后端人眼中的Vue(二)
- 神奇的Google二进制编解码技术:Protobuf
- 提升前端开发质量的十点经验沉淀
- Resize Observer 介绍及原理浅析
- 多图剖析公式 Async=Promise+Generator+自动执行器
- 谈谈ArrayList、Vector和LinkedList 的存储性能及特性
- 如何优化你的 Node.js API
- 表白代码,爱心树html
- 春节代码 新年快乐html 灯笼js
- 跨年代码 烟花html
- 一些简单html实例集合
- 每个初级 React 开发人员都会犯的八个错误