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

时间:2014-02-08 13:29:32

标签: c function void

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

4 个答案:

答案 0 :(得分:4)

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

noreturn属性平息了编译器警告。

要回答你的问题,我会在函数永不返回时使用它(即无限循环)并且你的编译器发出警告。

答案 1 :(得分:4)

不要为void函数执行此操作,这将导致未定义的行为。

只有当您知道您的函数永远不会返回给调用者时,才应使用新的C11构造_Noreturn。例如,当无条件地调用abortexit或类似,或者当您进入无限循环时,就会出现这种情况。

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

通常void函数,它们会返回调用者,只是在返回时,它们不会提供将要使用的值。对于大多数此类函数来说,声明它们从根本上是错误的

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

答案 2 :(得分:2)

我猜您的意思是__declspec(noreturn)__attribute__ ((noreturn));,请在您的问题中更准确。

当一个函数没有返回时,告诉你的编译器是一个好主意,它不会,所以它可以做一些优化,或者实际上避免某种优化。

编辑:@Mat纠正我说_NoReturn是标准C11。谢谢,我不知道; - )

答案 3 :(得分:0)