c - 如何跳转到返回值的宏/函数内的标签
问题描述
我有以下功能:
enum MqErrorE ReadI(struct MqS* ctx, int *i);
该函数将结果存储在i
其中并返回OK
或ERROR
标记。
如果函数返回ERROR
,我想跳转到一个名为error
.
int i;
if (ReadI(ctx,&i) == ERROR)
goto error;
// ...
error:
// do some error processing
为了使代码更“用户友好”,我想做一些类似的事情:
int i;
i = ReadI_something(ctx); // on error jump to "label"
// ...
error:
//...
换句话说,我既需要ReadI_something
返回一个值,又要能够跳转到标签。
作为限制,我想避免使用longjmp
/ setjmp
。
我怎样才能写一个宏或函数来做到这一点?
解决方案
如果您能够使用GNU 语句表达式扩展(在 gcc、clang 和 icc 中支持),那么它非常简单:
#define ReadI_something(ctx) \
({ \
int i; \
if (ReadI(ctx, &i) == ERROR) \
goto error; \
i; \
})
然后你可以这样做:
int i = ReadI_something(ctx);