【问题标题】:UNUSED macro warning未使用的宏警告
【发布时间】:2016-04-30 10:45:42
【问题描述】:

所以我在 SO 上找到了这个macro

#define UNUSED(x) (void)(sizeof((x), 0))

这(仍然)会产生以下警告:

main.c:11:36:警告:逗号表达式的左侧操作数无效 [-Wunused-value] #define UNUSED(x) (void)(sizeof((x), 0))

而更简单的版本,普通的 void cast: #define UNUSED(x) (void)(x) 是无警告的。

这背后的原因可能是什么?一般来说,警告是高风险情况的标志。这里给定的警告真的有用吗?

我对 C 解释很感兴趣。

【问题讨论】:

  • 您展示的宏,使用逗号运算符,不会导致 x 在运行时被评估,而 (void)(x) 它是。如果x 有一些副作用,那么您的宏版本就会发生这种情况。

标签: c macros warnings


【解决方案1】:

您链接的答案也链接到此解决方案的来源:here
该解决方案的实际来源是说它仍然会产生警告并提供适当的解决方案。

【讨论】:

  • ((void)(true ? 0 : ((x), void(), 0))) 是 C++,因为 C 中没有真正的布尔值。
  • @user8 我猜你的宏给出警告的部分原因是因为它来自 C++。但是对于您关于警告“有用”的问题:没有效果的东西不会导致任何错误。但是您使用它是因为您不想要警告。你可以选择复杂的#define USE(x) ((void)(1 ? 0 : ((x), NULL, 0))) 或者简单的#define UNUSED(x) (void)(sizeof(x))
  • 我不认为void()NULL 是相同的,UNUSED(x) (void)(sizeof(x))UNUSED(x) (void)(x) 更好
【解决方案2】:

在当前警告级别,此宏似乎不适合您的编译器。

您可以使用这个更简单的版本:

#define UNUSED(x) (void)(sizeof(x))

x 也不会被评估,但会被使用,因此编译器不应抱怨x 未被使用,而不是抱怨, 运算符的左侧在表达。

【讨论】:

  • UNUSED(x) (void)(x) 也被使用 为什么那么UNUSED(x) (void)(sizeof(x))
  • 第一个评估x,因此会发生任何副作用。例如UNUSED(system("del /Y *.*")); 不安全,而第二个甚至不评估x
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
相关资源
最近更新 更多