【问题标题】:applying noreturn attribute to macro function call将 noreturn 属性应用于宏函数调用
【发布时间】:2011-11-02 02:27:52
【问题描述】:

我有这样的宏:

#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 应用于宏甚至特定的函数调用?

【问题讨论】:

    标签: c gcc


    【解决方案1】:

    假设 GCC ≥ 4.5.0,

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

    【讨论】:

    • 我最终使用编译指示来禁用受影响代码行上的警告,但这似乎也是一个很好的解决方案
    【解决方案2】:

    唯一明智的方法是创建一个调用error_at_line 并标记为noreturn 的新函数。宏不能标记为noreturn,有时返回的函数也不能标记。

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

    【讨论】:

    • 这违背了error_at_line 的_at_line 部分的目的。
    • 您必须编写 LINE 宏,以便在您需要评估的地方对其进行评估。是的,这很痛苦。
    • 这样的宏怎么写?
    • 将该行作为参数传递给 noreturn 函数,并将__LINE__ 放入调用该函数的外部宏中。
    猜你喜欢
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 2014-09-07
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    相关资源
    最近更新 更多