применение атрибута noreturn к вызову функции макроса - PullRequest
2 голосов
/ 02 ноября 2011

У меня есть такой макрос:

#define error_exit(format, ...) \
    error_at_line(EXIT_FAILURE, 0, __FILE__, __LINE__, format, ##__VA_ARGS__)

, который я использую в качестве общей фатальной ошибки.К сожалению, error_at_line не имеет атрибута noreturn gcc, потому что если вы укажете 0 в качестве первого аргумента, он вернется.Это вызывает проблемы, в частности, я получаю предупреждения о неинициализированных переменных, потому что gcc не может понять, что error_exit никогда не вернется.

Например:

int x;
switch(...) {
    case VALID:
        x = 1;
        break;
    default:
        error_exit(...);
}
return x;

выдает мне предупреждение.Итак, как я могу применить noreturn к макросу или даже к конкретному вызову функции?

Ответы [ 2 ]

2 голосов
/ 02 ноября 2011

Предполагая GCC & ge; 4.5.0

#define error_exit(format, ...) \
    do { \
        error_at_line(EXIT_FAILURE, 0, __FILE__, __LINE__, format, ##__VA_ARGS__); \
        <a href="http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html" rel="nofollow">__builtin_unreachable()</a>; \
    } while (0)
2 голосов
/ 02 ноября 2011

Единственный разумный способ - создать новую функцию, которая вызывает error_at_line и помечается noreturn. Макрос не может быть помечен noreturn, как и функция, которая иногда возвращает.

Вместо #define используйте встроенную функцию, чтобы обернуть функцию, и отметьте ее noreturn.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...