4563|22

1071

帖子

7

TA的资源

纯净的硅(中级)

楼主
 

遇到一个有趣的问题 [复制链接]

  1. if(Rc_C.ARMED)

    LED_ON; //"LED_ON 是一个宏:#define LED_ON GPIO_ResetBits(GPIOB, GPIO_Pin_8);",LED_OFF也是

    else

    LED_OFF;

复制代码
就这样很普通的语句居然报错了,让我郁闷了一会 而给 if 加上花括号就没有报错了:
  1. if(Rc_C.ARMED)

    {

    LED_ON;

    }

    else

    LED_OFF;

复制代码
到这我大概知道报错的原因了,我试着把“LED_ON;”的分号去掉,果然,编译通过。 很明显出现这种报错的原因是 在“#define LED_ON GPIO_ResetBits(GPIOB, GPIO_Pin_8);”这个宏中已经 带了一个分号,如果在使用这个宏的时候又加分号就变成了两条语句:
if(Rc_C.ARMED) if(Rc_C.ARMED)
LED_ON; 等价于 GPIO_ResetBits(GPIOB, GPIO_Pin_8);;
else else
LED_OFF; GPIO_SetBits(GPIOB, GPIO_Pin_8);; 不得不说写代码一点都马虎不得
此帖出自stm32/stm8论坛

最新回复

恩恩,typedef跟它刚好相反。我碰到过typedef必须要加分号。呵呵,你的这个也算是让我明白了宏定义为啥不能加分号的含义啦。  详情 回复 发表于 2015-7-29 21:59
点赞 关注
 

回复
举报

1800

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
个人有时候也会出现这种错误,所以宏定义的时候要想想怎么被调用的
此帖出自stm32/stm8论坛
 
 

回复

188

帖子

1

TA的资源

一粒金砂(中级)

板凳
 
用宏定义的语句,先加大括号,保险
此帖出自stm32/stm8论坛

点评

嗯 这是比较规范的做法。之前我对很多人这样做不是很理解,感觉有点多此一举。现在懂了,代码还是规范点好,不然一不小心程序死哪了都不知道  详情 回复 发表于 2015-7-28 10:47
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

4
 
不错。
●#define 后面别写分号;
●若 #define 是复合句,干脆在 #define 行就加上括号,给调用者省事;
●养成 if语句内哪怕只一句也加花括号的习惯,一般多几个括号没什么坏处,只会使代码易读。
此帖出自stm32/stm8论坛

点评

恩恩,这种习惯是好。不过我个人有点毛病就是如果语句不长的话,花括号是见一个灭一个,因为那样看起来感觉简洁。这算洁癖吗  详情 回复 发表于 2015-7-28 10:45
 
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

5
 
仙猫 发表于 2015-7-28 10:39
不错。
●#define 后面别写分号;
●若 #define 是复合句,干脆在 #define 行就加上括号,给调用者省事; ...

恩恩,这种习惯是好。不过我个人有点毛病就是如果语句不长的话,花括号是见一个灭一个,因为那样看起来感觉简洁。这算洁癖吗
此帖出自stm32/stm8论坛

点评

看来是有点洁癖哈……不过未必是坏事。 兵无常势,水无常形,把什么都压抑死这个世界就出不了彩了。 被公认为能排唐诗首席的崔颢作的《黄鹤楼》,平仄多处出律,是犯格律诗大忌的。但若规规矩矩,或许中华文化瑰宝  详情 回复 发表于 2015-7-28 11:03
 
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

6
 
mylsf 发表于 2015-7-28 10:37
用宏定义的语句,先加大括号,保险

嗯  这是比较规范的做法。之前我对很多人这样做不是很理解,感觉有点多此一举。现在懂了,代码还是规范点好,不然一不小心程序死哪了都不知道
此帖出自stm32/stm8论坛
 
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

7
 
dj狂人 发表于 2015-7-28 10:45
恩恩,这种习惯是好。不过我个人有点毛病就是如果语句不长的话,花括号是见一个灭一个,因为那样看起来感 ...

看来是有点洁癖哈……不过未必是坏事。
兵无常势,水无常形,把什么都压抑死这个世界就出不了彩了。
被公认为能排唐诗首席的崔颢作的《黄鹤楼》,平仄多处出律,是犯格律诗大忌的。但若规规矩矩,或许中华文化瑰宝里就少了这首好诗了!
此帖出自stm32/stm8论坛

点评

嗯 是不能有太多的框框架架。特别是对编程人员,太多框架在一定程度上对思维是一种限制,容易让人缺乏创新。当然不要太多框架不是让人不需要太过于严谨,那是不同的概念了。对于编程人员来说保持严谨是必须的。  详情 回复 发表于 2015-7-28 11:17
 
 
 

回复

466

帖子

0

TA的资源

版主

8
 
你的宏定义本来就有点问题
此帖出自stm32/stm8论坛

点评

嗯 确实。一般都是不加分号的。  详情 回复 发表于 2015-7-28 11:11
 
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

9
 
weizhongc 发表于 2015-7-28 11:04
你的宏定义本来就有点问题

嗯  确实。一般都是不加分号的。
此帖出自stm32/stm8论坛
 
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

10
 
仙猫 发表于 2015-7-28 11:03
看来是有点洁癖哈……不过未必是坏事。
兵无常势,水无常形,把什么都压抑死这个世界就出不了彩了。
被 ...

嗯  是不能有太多的框框架架。特别是对编程人员,太多框架在一定程度上对思维是一种限制,容易让人缺乏创新。当然不要太多框架不是让人不需要太过于严谨,那是不同的概念了。对于编程人员来说保持严谨是必须的。
此帖出自stm32/stm8论坛
 
 
 

回复

1万

帖子

203

TA的资源

管理员

11
 
;虽小但是不容忽视呀~
此帖出自stm32/stm8论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

12
 
所以才会有do{}while(0)的语句出现…
此帖出自stm32/stm8论坛

点评

这个怎么说  详情 回复 发表于 2015-7-28 11:26
 
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

13
 
qiushenghua 发表于 2015-7-28 11:22
所以才会有do{}while(0)的语句出现…

这个怎么说
此帖出自stm32/stm8论坛

点评

#define functiion() do{\ language1();\ language2();\ }while(0) 调用的时候: functions();  详情 回复 发表于 2015-7-28 11:30
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

14
 

#define functiion() do{\
language1();\
language2();\
}while(0)

调用的时候:
functions();
此帖出自stm32/stm8论坛

点评

do()while() 应该应该不是因为这个才出现的吧。只能说do{}while()刚好适合这样用  详情 回复 发表于 2015-7-28 11:41
 
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

15
 
qiushenghua 发表于 2015-7-28 11:30
#define functiion() do{\
language1();\
language2();\
}while(0)

调用的时候:
functions();

do()while()  应该应该不是因为这个才出现的吧。只能说do{}while()刚好适合这样用
此帖出自stm32/stm8论坛

点评

while(0)  详情 回复 发表于 2015-7-28 12:41
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

16
 
dj狂人 发表于 2015-7-28 11:41
do()while()  应该应该不是因为这个才出现的吧。只能说do{}while()刚好适合这样用

while(0)
此帖出自stm32/stm8论坛

点评

为什么不直接用花括号呢,像这样子 #define functiion() {\ language1();\ language2();\ }  详情 回复 发表于 2015-7-28 14:07
 
 
 

回复

49

帖子

0

TA的资源

一粒金砂(初级)

17
 
我习惯“#define”定义不加符号。
此帖出自stm32/stm8论坛
 
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

18
 

为什么不直接用花括号呢,像这样子

#define functiion() {\
language1();\
language2();\
}
此帖出自stm32/stm8论坛

点评

do {...}while(0) + ; ===>一条语句 {...} + ; ===>两条语句 你可以把这个调用想象在没有大括号的if语句里面,就会有和本帖主题一样的错误。  详情 回复 发表于 2015-7-28 16:26
 
 
 

回复

6040

帖子

202

TA的资源

版主

19
 
dj狂人 发表于 2015-7-28 14:07
为什么不直接用花括号呢,像这样子

#define functiion() {\
language1();\
language2();\
}

do {...}while(0)    +    ;    ===>一条语句
{...}                    +    ;    ===>两条语句
你可以把这个调用想象在没有大括号的if语句里面,就会有和本帖主题一样的错误。
此帖出自stm32/stm8论坛

点评

懂了,C语言果然博大精深  详情 回复 发表于 2015-7-28 21:24
 
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

20
 
lcofjp 发表于 2015-7-28 16:26
do {...}while(0)    +    ;    ===>一条语句
{...}                    +    ;    ===>两条语句
你可 ...

懂了,C语言果然博大精深
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表