9

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

void hello(void){
  int i;
  i=1;
 }

为什么会发生?对这个函数的所有调用都是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
4

2 回答 2

29

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

这是使用noreturn属性完成的:

void func() __attribute__ ((noreturn));

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

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

#include <stdlib.h>

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

在这里,我exitexit(3).

这种冲突的另一个明显候选者是abort(3)

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

于 2013-04-12T06:13:25.423 回答
4

最有可能的是,该功能标有__attribute__((noreturn))。但是,它确实返回(当控制到达 irs 主体的末尾时,由于它没有进入无限循环,它不会调用其他“noreturn”函数等)

我不明白你的意思是 1. 将函数标记为不返回,2. 编写一个什么都不做的函数 - 也许你可以同时消除两者?

于 2013-04-12T06:15:25.610 回答