防止GCC警告"未使用计算的值"对于一个宏

时间:2012-11-02 20:58:25

标签: c gcc gcc-warning

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

#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.
}

如果在if语句之前err已经不正常,则不会调用该函数。将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强制转换前缀并不理想。有什么建议吗?

3 个答案:

答案 0 :(得分:4)

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

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

请记住最后使用 e == OK (不是0),否则编译器不会将其作为声明接受。

答案 1 :(得分:2)

我会选择这样的东西

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

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

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

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

bool notOK(int err);

在.c文件中。

答案 2 :(得分:1)

只是一个想法。

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*/