本文主要是介绍【C语言高级操作】之蓦然回首那人却在灯火阑珊处,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 1.表达式
- warning: #174-D: expression has no effect
1.表达式
warning: #174-D: expression has no effect
字面意思表达式无效,恭喜你写了一个自认为对,但没有实际效果的bug
比如我写的
#define MDL_ADS112U04_AUTO_READ(port, recbuf) \do \{ \uint16_t usLen = WkUartRxChars(port, recbuf); \usLen; \} while (0)
报错原因是本意是想用uslen来充当函数返回值,但实际没有达到目的。正确做法如果你也这么认为那和笔者犯了同样错误
这种问题只会提示waring,不会提示error,论看waring重要性
#define MDL_ADS112U04_AUTO_READ(port, recbuf) \( do \{ \uint16_t usLen = WkUartRxChars(port, recbuf); \usLen; \} while (0))
bug1:do {}while(0) 大括号内的作用域作用不到小括号
bug2 : while(0)后面少分号
正确做法吐了,能不能编过还的看编译器
#define MDL_ADS112U04_AUTO_READ(port, recbuf) \( do \{ \uint16_t usLen = WkUartRxChars(port, recbuf); \usLen; \} while (0);)
ARM compiler 和 GCC 不一样,very good
回顾以前博客链接我终于找到点蛛丝马迹
参考GNU C 扩展 表达式
括在括号中的复合语句可能显示为表达式 在 GNU C 中。这允许您使用循环、开关和局部变量 在表达式中。回想一下,复合语句是一系列被包围的语句 通过大括号;在此构造中,括号围绕大括号。为 例:({ int y = foo (); int z;if (y > 0) z = y;else z = - y;z; })
是一个有效的(尽管比必要的稍微复杂一些)表达式 对于 的绝对值
如果就想用GNU C 代码规范 直接百度就有
这篇关于【C语言高级操作】之蓦然回首那人却在灯火阑珊处的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!