Как перейти к метке внутри макроса / функции, которая возвращает значение - PullRequest
0 голосов
/ 01 мая 2018

У меня есть следующая функция:

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.

Как мне написать макрос или функцию для этого?

1 Ответ

0 голосов
/ 01 мая 2018

Если вы можете использовать расширение выражения оператора GNU (поддерживается в gcc, clang и icc), это довольно просто:

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

Тогда вы можете сделать:

int i = ReadI_something(ctx);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...