[[noreturn]] 函数指针

[[noreturn]] function pointer

本文关键字:指针 函数 noreturn      更新时间:2023-10-16

当我使用clang(version 3.4 (trunk 194574))来编译它时:

typedef void (* FunctionThatNeverReturns [[ noreturn ]])();

我明白这个:

error: 'noreturn' attribute only applies to functions and methods

这让我感到惊讶,因为它在旧版本的 clang 上工作得很好。

那么如何定义指向[[ noreturn ]]函数的指针呢?

我需要这个,因为我正在[[ noreturn ]]函数中调用函数指针,如果函数指针未标记为 noreturn,该函数显然会产生警告。

哦,这有效:

typedef void (* FunctionThatNeverReturns [[ gnu::noreturn ]])();

但是没有独立于编译器的解决方案吗?

试试这个

typedef void (* FunctionThatNeverReturns)() [[ noreturn ]];

在原件中,说明符的放置使其应用于指针,而不是指向的对象。 但是 noreturn 指针根本没有意义,您正在尝试 typedef 指向 noreturn 函数的指针。

演示:http://ideone.com/9mBR9x

这个版本似乎按预期编译:

[[noreturn]] void AFunctionThatDoesNotReturn() {}
using FunctionThatNeverReturns = std::add_pointer_t<decltype(AFunctionThatDoesNotReturn)>;

但是编译器在验证时失败,我们实际上断言了一个指向指针的不返回函数指针: https://ideone.com/YAo73S

如评论中所述,这显然是标准所禁止的。