5

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

#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-statement 之后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演员表远非理想。有什么建议么?

4

3 回答 3

5

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

( (e == OK) ? ((e = call) != OK) : (e == OK) )
于 2012-11-02T21:10:20.257 回答
2

我会去做这样的事情

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

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

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

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

bool notOK(int err);

在 .c 文件中。

于 2012-11-02T21:11:17.963 回答
1

只是一个想法。

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

您可能想要#define inline __inline__#define inline /*nothing*/使用非 gcc 编译器。

于 2012-11-02T21:15:28.693 回答