博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STM32—常用的几种伪指令宏
阅读量:3949 次
发布时间:2019-05-24

本文共 2575 字,大约阅读时间需要 8 分钟。

1.说到伪指令宏一般就会联想到指令、宏指令和伪指令。

先借用别人的话简单介绍一下三者之间的关联和区别(看到一个博主写的很不错):

我们使用的各种指令,都是写给“编译软件”看的。
要由“编译软件”翻译成计算机可以识别的机器语言,即机器码。

通俗地讲:

就好像召开新闻发布会,主持人用中文讲话,由一个翻译,现场翻译成英文,讲给外国记者听。
主持人说的中文,大部分都是要翻译成英文的;少数几句,是说给翻译听的,告诉他如何翻译。

我们写的指令,由“编译软件”翻译成机器码的,称为指令语句;

有一些是写给“编译软件”看的,不翻译成机器码,这样的就是“伪指令”。

一条条计算机的指令,一般来说,功能都是极为简单的。我们可以把几条、几十条指令,编写成一个“宏指令”,来完成一个比较复杂的任务。
在这样“一批指令”的前面,要用一条“伪指令”来命名这个“宏指令”;
在后面,要用一条“伪指令”说明结尾。
以后,这个“宏指令”,就可以当成 正式指令 来使用了。

作者:baidu_知道

来源:CSDN
原文:
版权声明:本文为博主原创文章,转载请附上博文链接!

2.伪指令宏分为简单宏、参数宏、条件宏、预定义宏和宏释放

简单宏:

定义格式: #define 宏标识符 宏体
是最常见的宏,在宏体长的时候使用续行符“\”连接宏体,如示

#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \                                    ((PERIPH) == GPIOB) || \                                    ((PERIPH) == GPIOC) || \                                    ((PERIPH) == GPIOD) || \                                    ((PERIPH) == GPIOE) || \                                    ((PERIPH) == GPIOF) || \                                    ((PERIPH) == GPIOG))

宏的用法:在源文件中,用预处理器伪指令定义过宏标识符后,就可以用宏标识符编写程序。当源文件被预处理器处理时,每遇到该宏标识符,预处理器便在宏的所在处将宏扩展为宏体。

参数宏:
定义格式:#define 宏标识符(形式参数表) 宏体
形式参数表为逗号分割的形式参数,宏体可以用“\”进行续行,使用参数宏时形式参数被换为相同个数的实参数表。(类似于函数的调用,实际上许多库函数时用参数宏编写的。二者区别是参数宏的形式参数表中没有类型说明符)
举例如示

#define IS_GET_GPIO_PIN(PIN) (((PIN) == GPIO_Pin_0) || \                              ((PIN) == GPIO_Pin_1) || \                              ((PIN) == GPIO_Pin_2) || \                              ((PIN) == GPIO_Pin_3) || \                              ((PIN) == GPIO_Pin_4) || \                              ((PIN) == GPIO_Pin_5) || \                              ((PIN) == GPIO_Pin_6) || \                              ((PIN) == GPIO_Pin_7) || \                              ((PIN) == GPIO_Pin_8) || \                              ((PIN) == GPIO_Pin_9) || \                              ((PIN) == GPIO_Pin_10) || \                              ((PIN) == GPIO_Pin_11) || \                              ((PIN) == GPIO_Pin_12) || \                              ((PIN) == GPIO_Pin_13) || \                              ((PIN) == GPIO_Pin_14) || \                              ((PIN) == GPIO_Pin_15))

预处理器在处理参数宏时使用俩次宏展开。第一次展开宏体,第二次对展开的宏体用实参数替换形式参数。

宏释放:
定义格式: #undef 宏标识符
用于释放原定义的宏标识符,释放后的宏标识符可以再次用于定义其他宏体。
条件宏定义:
条件宏定义主要是用来测试是否定义过某宏标识符,以及决定如何处理宏标识符,具体格式有俩种:

\\测试存在情况#ifdef  宏标识符	#undef  宏标识符	#define  宏标识符  宏体#else	#define  宏标识符  宏体#endif\\测试不存在情况#ifndef  宏标识符	#define  宏标识符  宏体#else	#undef  宏标识符	#define  宏标识符  宏体#endif

常用于头文件中。

预定义宏:
预定义宏基本莫得存在感,其特征就是标识符前后都有双下划线。如

__DATE__     __TIME____FILE__     __LINE____STDC__

这些预定义宏的宏体分别是当时的日期、时间、所在文件名、所在文件的行数。

这些宏在后续的学习阶段会频繁出现,在此总结一下。

你可能感兴趣的文章
字节跳到面试题
查看>>
Linux查看物理CPU个数
查看>>
Linux学习之网络IO,磁盘io
查看>>
ES7.6.2安装
查看>>
查看jar依赖树
查看>>
idea运行gradle项目
查看>>
es安装ltr插件
查看>>
开源ltr-es-7.6.2代码到本地idea打开出现各种错误总结
查看>>
Requests实践详解&& python通过连接开启https的elasticsearch7 服务器
查看>>
ES查询流程源码解析
查看>>
ldaps与ldap over TLS
查看>>
jvm为什么把-Xms和-Xmx的值设置成一样
查看>>
2021-01-21对map进行key或者value排序
查看>>
ConcurrentHashMap 1.7和1.8的区别
查看>>
阻塞锁与自旋锁
查看>>
【面试官:select语句和update语句分别是怎么执行的
查看>>
mysql回表查询,聚集索引与普通索引
查看>>
乐观锁与悲观锁
查看>>
单例设计模式
查看>>
装饰设计模式和代理设计模式的区别
查看>>