字面意思表达式无效,恭喜你写了一个自认为对,但没有实际效果的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 代码规范 直接百度就有