【C语言高级操作】之蓦然回首那人却在灯火阑珊处

发布时间:2023年12月29日

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 代码规范 直接百度就有

文章来源:https://blog.csdn.net/qq_44704780/article/details/135267445
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。