OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5829|回复: 8

宏定义中使用续行符\,但是在LED2_OFF后面没有分号,为什么依然可以编辑通过

[复制链接]

17

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
332
金钱
332
注册时间
2021-1-19
在线时间
56 小时
发表于 2022-11-5 09:28:55 | 显示全部楼层 |阅读模式
1金钱
1.png
有分号的话,不就是相当于LED2_OFF; LED3_OFF      
没有分号的话,不就是相当于LED2_OFFLED3_OFF  
所以按我的理解,没有分号不应该出错吗

最佳答案

查看完整内容[请看2#楼]

终于发现问题了,原来宏定义有两层,我只看到了第一层还以为那就是最原始的定义,第二层用中括号括起来了,所以LED2_OFF后面没有分号也可以 我的问题,给各位热心网友添麻烦了,以后宏定义得仔细看看是不是最底层 谢谢啦 所有相关源代码如下 /* 直接操作寄存器的方法控制IO */ #define digitalHi(p,i) {p->BSRR=i;} //设置为高电平 #define digitalLo(p,i) {p->BSRR=(uint32_t)i ODR ^=i;} //输出反转状态 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
332
金钱
332
注册时间
2021-1-19
在线时间
56 小时
 楼主| 发表于 2022-11-5 09:28:56 | 显示全部楼层
终于发现问题了,原来宏定义有两层,我只看到了第一层还以为那就是最原始的定义,第二层用中括号括起来了,所以LED2_OFF后面没有分号也可以
我的问题,给各位热心网友添麻烦了,以后宏定义得仔细看看是不是最底层
谢谢啦
所有相关源代码如下
/* 直接操作寄存器的方法控制IO */
#define        digitalHi(p,i)                        {p->BSRR=i;}                          //设置为高电平               
#define digitalLo(p,i)                        {p->BSRR=(uint32_t)i << 16;}                                //输出低电平
#define digitalToggle(p,i)                {p->ODR ^=i;}                        //输出反转状态


/* 定义控制IO的宏 */
#define LED1_TOGGLE                digitalToggle(LED1_GPIO_PORT,LED1_PIN)
#define LED1_OFF                  digitalHi(LED1_GPIO_PORT,LED1_PIN)
#define LED1_ON                          digitalLo(LED1_GPIO_PORT,LED1_PIN)

#define LED2_TOGGLE                digitalToggle(LED2_GPIO_PORT,LED2_PIN)
#define LED2_OFF                  digitalHi(LED2_GPIO_PORT,LED2_PIN)
#define LED2_ON                          digitalLo(LED2_GPIO_PORT,LED2_PIN)

#define LED3_TOGGLE                digitalToggle(LED3_GPIO_PORT,LED3_PIN)
#define LED3_OFF                  digitalHi(LED3_GPIO_PORT,LED3_PIN)
#define LED3_ON                          digitalLo(LED3_GPIO_PORT,LED3_PIN)

#define LED4_TOGGLE                digitalToggle(LED4_GPIO_PORT,LED4_PIN)
#define LED4_OFF                  digitalHi(LED4_GPIO_PORT,LED4_PIN)
#define LED4_ON                          digitalLo(LED4_GPIO_PORT,LED4_PIN)

/* 基本混色,后面高级用法使用PWM可混出全彩颜色,且效果更好 */
                                       
//(全部打开)
#define LED_ALLON        \
                                        LED1_ON;\
                                        LED2_ON\
                                        LED3_ON\
                                        LED4_ON
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8463
金钱
8463
注册时间
2020-5-11
在线时间
3904 小时
发表于 2022-11-5 10:20:46 | 显示全部楼层
那得看LED2_OFF的定义,引用宏定义不一定要加分号
专治疑难杂症
回复

使用道具 举报

5

主题

134

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1389
金钱
1389
注册时间
2019-5-29
在线时间
163 小时
发表于 2022-11-5 10:24:11 | 显示全部楼层
#define 预处理仅做一个简单的替换工作,这样子写编译器通过,但是不一定按照你的想法来运行
偷偷摸鱼
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3359
金钱
3359
注册时间
2011-11-10
在线时间
207 小时
发表于 2022-11-5 11:53:45 | 显示全部楼层
编译器不检查你的宏定义的。把你代码里定义的替换一下编译通过了很正常。
回复

使用道具 举报

17

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
332
金钱
332
注册时间
2021-1-19
在线时间
56 小时
 楼主| 发表于 2022-11-5 12:12:41 | 显示全部楼层
LcwSwust 发表于 2022-11-5 10:20
那得看LED2_OFF的定义,引用宏定义不一定要加分号

LED2_OFF对应的宏定义后面没有分号,所以觉得有问题
回复

使用道具 举报

17

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
332
金钱
332
注册时间
2021-1-19
在线时间
56 小时
 楼主| 发表于 2022-11-5 12:14:22 | 显示全部楼层
编译通过了,而且运行也正常,就很神奇,这是不是一个bug
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8463
金钱
8463
注册时间
2020-5-11
在线时间
3904 小时
发表于 2022-11-5 13:10:59 | 显示全部楼层
龙的传人98 发表于 2022-11-5 12:12
LED2_OFF对应的宏定义后面没有分号,所以觉得有问题

对应的宏定义是啥?发出来看看啊。
专治疑难杂症
回复

使用道具 举报

17

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
332
金钱
332
注册时间
2021-1-19
在线时间
56 小时
 楼主| 发表于 2022-11-6 09:08:01 | 显示全部楼层
LcwSwust 发表于 2022-11-5 13:10
对应的宏定义是啥?发出来看看啊。

找到了最源头的宏定义,终于明白了,谢谢
#define        digitalHi(p,i)                        {p->BSRR=i;}                          //设置为高电平
#define LED2_OFF                  digitalHi(LED2_GPIO_PORT,LED2_PIN)
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 21:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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