将noreturn属性应用于宏函数调用

时间:2011-11-02 02:27:52

标签: c gcc

我有这样的宏:

#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 个答案:

答案 0 :(得分:2)

唯一合理的方法是创建一个名为error_at_line的{​​{1}}调用新函数。宏不能标记为noreturn,也不能标记有时返回的函数。

使用内联函数来包装函数,并将其标记为noreturn,而不是#define

答案 1 :(得分:2)

假设GCC≥4.5.0,

#define error_exit(format, ...) \
    do { \
        error_at_line(EXIT_FAILURE, 0, __FILE__, __LINE__, format, ##__VA_ARGS__); \
        __builtin_unreachable(); \
    } while (0)