野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13528|回复: 4

关于固件库点亮LED例程的一点疑问

[复制链接]
发表于 2020-3-23 18:18:50 | 显示全部楼层 |阅读模式
bsd_led.h头文件中的宏定义
/* 直接操作寄存器的方法控制IO */
#define        digitalHi(p,i)                 {p->BSRR=i;}         //输出为高电平               
#define     digitalLo(p,i)                 {p->BRR=i;}         //输出低电平
#define     digitalToggle(p,i)         {p->ODR ^=i;} //输出反转状态


里面的语句都带有大括号,而且大括号里语句的结束已经有分号了,按照C语言直接替换的规则,是不是连分号和大括号都一起替换?如果是这样调用语句
while (1)
        {
                LED1_ON;                          // 亮
                SOFT_DELAY;
                LED1_OFF;                   // 灭

         }
替换后是不是这样
while (1)
        {
                {GPIOB->BRR=GPIO_Pin_5;};                          // 亮
                SOFT_DELAY;
                {GPIOB->BSRR=GPIO_Pin_5;};                   // 灭

         }
这里的分号和大括号是不是多余?但编译运行都是正常的,是我理解的有错吗?宏定义一般要求不加分号?这里的操作有点看不懂,道行太浅
希望各位大神给予指点,谢谢1

回复

使用道具 举报

发表于 2020-3-24 20:06:33 | 显示全部楼层
划出单独的一个代码块作用域,相当于里面的标识符比如变量是局部这里的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-25 10:30:40 | 显示全部楼层
WishWish 发表于 2020-3-24 20:06
划出单独的一个代码块作用域,相当于里面的标识符比如变量是局部这里的

好像有点懂了,但又不太明白,请问这里宏定义的时候不加大括号和分号是不是一样的效果,有什么不好的地方吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-25 11:01:07 | 显示全部楼层
明白了,是不是为限定变量的作用域,表示局部变量只在这个括号范围累有用
回复 支持 反对

使用道具 举报

发表于 2020-3-25 15:27:11 | 显示全部楼层
c的语法里,分号‘’代表语句结束,其实就是编译器做词法分析时候的语句分割符,打个比方,你想想在word里打字,空一行和空10行是一个效果。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-19 19:24 , Processed in 0.040797 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表