c - “noreturn”函数确实返回

标签 c gcc compiler-errors warnings compiler-warnings

当我编译下面的 C 程序时,我得到这个警告: “noreturn”函数确实返回。这是函数:

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

最佳答案

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

这是使用 noreturn attribute 完成的:

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(),那么罪魁祸首几乎肯定在您的代码库中的某个地方。

关于c - “noreturn”函数确实返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15964219/

相关文章:

c - 在 c 中重新分配时出错(异常 trown (ucrtbased.dll))

objective-c - 如何在两个沙盒应用程序之间共享首选项文件?

我可以 fork 进程并执行内部函数吗?

java - 如何在 Eclipse 编辑器中仅显示编译错误?

java - 尝试计算GPA

c - 这个数组是静态的还是动态的?

OS X 中使用 openmp 的 Python 扩展

使用不同的堆栈指针调用 C 函数 (gcc)

c - 原子加载和存储函数生成与非原子加载和存储相同的汇编代码

java - 非静态变量 this 不能在 Java 的静态上下文中引用