什么时候应该在C中使用函数属性noreturn?

oct*_*ian 8 c function void

我最近发现了这个属性(我指的是c,而不是c ++,因为我正在研究一个ac项目,它有一个库,其中定义了一个等价物,它的目的只是用于c).什么时候使用它是好的做法?在所有void函数声明中?有没有例外?

Jen*_*edt 7

不要为你的void函数这样做,这会产生未定义的行为。

_Noreturn仅当您知道您的函数永远不会返回给调用者时,才应使用新的 C11 构造。这可以例如这样的情况,当它无条件地使一个呼叫abortexit或相似,或当你进入无限循环。

这样做的目的是编译器可以优化调用方的调用,特别是通过切断调用之后的整个执行分支。

通常void函数不是那种类型,它们返回给调用者,只是在返回时它们不提供将被使用的值。对于大多数这样的函数,声明它们是根本错误的

C11 语法是_Noreturnor 带有宏noreturn。并非所有编译器都实现了该功能,但大多数编译器都扩展了 C99(或 C89)以提供相同的功能。在该平台上,您通常可以定义一个noreturn可以向上兼容替换的宏。


Jos*_*itt 5

我将它们用于具有无限while循环的main(...)函数。它用于嵌入式系统。

noreturn属性可缓和编译器警告。

为了回答您的问题,当函数永不返回(即无限的while循环)并且您的编译器发出警告时,我将使用它。


zmo*_*zmo 2

我猜你的意思__declspec(noreturn)是或者__attribute__ ((noreturn));

当函数没有返回时,最好告诉编译器它没有返回,这样它就可以进行一些优化,或者实际上避免某种优化。

_NoReturn是标准C11