我最近发现了这个属性(我指的是c,而不是c ++,因为我正在研究一个c项目,它有一个库,其中定义了一个等价物,它的目的只是用于c)。什么时候使用它是好的做法?在所有void函数声明中?有没有例外?
答案 0 :(得分:4)
我已将它们用于具有无限while循环的main(...)函数。这是一个嵌入式系统。
noreturn属性平息了编译器警告。
要回答你的问题,我会在函数永不返回时使用它(即无限循环)并且你的编译器发出警告。
答案 1 :(得分:4)
不要为void
函数执行此操作,这将导致未定义的行为。
只有当您知道您的函数永远不会返回给调用者时,才应使用新的C11构造_Noreturn
。例如,当无条件地调用abort
,exit
或类似,或者当您进入无限循环时,就会出现这种情况。
这样做的目的是编译器可以优化调用方面的调用,特别是通过切断调用之后的整个执行分支。
通常void
函数不,它们会返回调用者,只是在返回时,它们不会提供将要使用的值。对于大多数此类函数来说,声明它们从根本上是错误的。
C11语法为_Noreturn
或宏noreturn
。并非所有编译器都实现了该功能,但大多数都具有提供相同功能的C99(或C89)扩展。在这些平台上,您通常可以定义宏noreturn
,它将是向上兼容的替换。
答案 2 :(得分:2)
我猜您的意思是__declspec(noreturn)
或__attribute__ ((noreturn));
,请在您的问题中更准确。
当一个函数没有返回时,告诉你的编译器是一个好主意,它不会,所以它可以做一些优化,或者实际上避免某种优化。
答案 3 :(得分:0)