【问题标题】:Prevent GCC warning "value computed is not used" for a macro防止宏的 GCC 警告“未使用计算的值”
【发布时间】:2012-11-02 20:58:25
【问题描述】:

我正在开发一个支持错误处理的宏。

#define Try(e, call)   ( (e == OK) && ((e = call) != OK) )

它可以用作if语句的表达式:

if (Try(err, SomeFunction(foo, bar))) {
    // Entered only if err was OK before the if-statement and SomeFunction()
    // returned a non-OK value.
}

如果err 在 if 语句之前已经不正常,则不会调用该函数。 if语句后err会被设置为SomeFunction()的返回值。

到目前为止一切顺利。但是我也想使用没有 if 语句的宏:

Try(err, SomeFunction(foo, bar));

在这种情况下,GCC 会给出以下警告:

warning: value computed is not used [-Wunused-value]

这就是我的问题所在:如何重写宏以使 GCC 不会产生此警告。我知道可以使用标志禁用警告(但我想为其他代码保持启用状态)或将结果显式转换为void。以下语句代码不会产生警告:

(void) Try(err, SomeFunction(foo, bar));

但是,在每个 Try() 前面加上 void 演员表并不理想。有什么建议吗?

【问题讨论】:

  • 两个宏,Check(e,call) 现在是Try#define Try(e,call) (void)Check(e,call)
  • @DanielFischer:如果我找不到其他解决方案,这确实是我的想法,但我更愿意用一个宏来解决这个问题。
  • 恐怕没有骰子。您需要返回一个值以供if 使用,然后任何裸调用都将是未使用的值。

标签: c gcc gcc-warning


【解决方案1】:

你可以像这样使用三元运算符:

( (e == OK) ? ((e = call) != OK) : (e == OK) )

【讨论】:

  • 为什么不是 0? Works for me. (另外,感谢您建议如何改写它以使愚蠢的编译器静音;我从提交消息中链接了这个答案。)
  • @mirabilos 我不记得我为什么写这个,所以我删除了它。谢谢!
【解决方案2】:

我会选择这样的东西

inline
bool notOK(int err) {
  return err != OK;
}

#define Try(e, call)   ( !notOK(e) && notOK(e = call) )

通常编译器不会抱怨未使用的函数返回值。

出于调试目的,可能还需要添加“实例化”

bool notOK(int err);

在 .c 文件中。

【讨论】:

    【解决方案3】:

    只是一个想法。

    static inline int identity (int x) { return x; }
    #define Try(e, call)   (identity ((e == OK) && ((e = call) != OK)))
    

    对于非 gcc 编译器,您可能需要 #define inline __inline__#define inline /*nothing*/

    【讨论】:

    • 任何符合 C99 的编译器都接受 inline 关键字,尽管这使得许多编译器不接受它。 (“non-gcc”让它听起来像是一个扩展,它不再是,只是)。
    猜你喜欢
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多