'noreturn'功能确实会回归

use*_*729 8 c gcc warnings compiler-errors compiler-warnings

当我编译下面的C程序时,我得到了这个警告: ‘noreturn’ function does return.这是功能:

void hello(void){
  int i;
  i=1;
 }
Run Code Online (Sandbox Code Playgroud)

为什么会这样?所有对此功能的调用都是hello();

编辑:完整的错误输出:

 home.c: In function ‘hello’:
 hhme.c:838:7: error: variable ‘i’ set but not used [-Werror=unused-but-set-variable]
 home.c:840:1: error: ‘noreturn’ function does return [-Werror]
 cc1: all warnings being treated as errors
 make: *** [home.o] Error 1
Run Code Online (Sandbox Code Playgroud)

NPE*_*NPE 26

可以告诉gcc某个特定函数永远不会返回.这允许某些优化,并有助于避免未初始化变量的虚假警告.

这是使用以下noreturn属性完成的:

void func() __attribute__ ((noreturn));
Run Code Online (Sandbox Code Playgroud)

如果函数确实返回了尽管noreturn属性,则编译器会发出您正在看到的警告(在您的情况下会转换为错误).

由于您不太可能noreturn在代码中使用,可能的解释是您有一个名称与标准noreturn函数冲突的函数,如下例所示:

#include <stdlib.h>

void exit(int) {
}                // warning: 'noreturn' function does return [enabled by default]
Run Code Online (Sandbox Code Playgroud)

在这里,我的exit冲突exit(3).

这种冲突的另一个显而易见的候选人是abort(3).

当然,如果你的函数实际被调用hello(),那么罪魁祸首几乎肯定在你的代码库中.