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