我有这样的宏:
#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应用于宏甚至特定的函数调用?
答案 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)