首页 > 解决方案 > 如何跳转到返回值的宏/函数内的标签

问题描述

我有以下功能:

enum MqErrorE ReadI(struct MqS* ctx, int *i);

该函数将结果存储在i其中并返回OKERROR标记。

如果函数返回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

我怎样才能写一个宏或函数来做到这一点?

标签: cmacrosgoto

解决方案


如果您能够使用GNU 语句表达式扩展(在 gcc、clang 和 icc 中支持),那么它非常简单:

#define ReadI_something(ctx) \
    ({ \
        int i; \
        if (ReadI(ctx, &i) == ERROR) \
            goto error; \
        i; \
    })

然后你可以这样做:

int i = ReadI_something(ctx);

推荐阅读