我正在开发一个支持错误处理的宏。
#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
强制转换前缀并不理想。有什么建议吗?
答案 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*/
。