C - 警告:即使主功能中有"return 0;",控制也达到非无效功能 [-Wreturn 型] 的末尾



我在这里有一些代码,可以提出警告

控制达到非空隙函数的末端[-wreturn-type]

让我感到困惑的是,如果我在功能打印机中添加return 0;,警告将消失。我是语言C的新生,因此希望您能帮助我解决这个问题。谢谢。

#include <stdio.h>
int printer(int *ip){
    printf("%d", *ip);
//  return 0; //with the expression, the warning will disappear. why?
}
int main(int argc, char *argv[]){
    int number = 10;
    int *ip;
    ip = &number;
    printer(ip);
    return 0;
}

您声明打印机函数返回整数。

int printer(...

但是您不返回整数。我认为您需要做到

void printer(...

为了使其在函数中没有返回语句的情况下工作

编译器正在打印printer()的警告,因为它不能假设该函数永远不会从其他函数中调用,而不是main()以外的其他函数,并且其返回值无意中使用。

要解决此问题,您必须放弃编写如此危险的代码:通过return语句返回一些值或将返回值的类型声明为void

int printer(int *ip){
    printf("%d", *ip);
//  return 0; //with the expression, the warning will disappear. why?
}

此函数返回类型int的值,因为它在其标题中指定:

int printer(int *ip)

语句开头的int意味着该函数应该返回调用它的函数的值。这意味着调用功能期望printer()的值。

如果您有void返回值,则调用函数不会期望返回值,因此要执行这样的操作:

 int num = AnyFunction();

其中AnyFunction()是返回void的示例函数,或什么都不会导致错误。但是,如果AnyFunction()返回int值,则上述语句有效,这是您的情况。现在,如果您的功能不返回任何内容,即使应该返回任何内容,那么num中将存储什么值?

因此,编译器会给您警告,因为您不得在代码中使用printer()函数的返回值,因此不需要返回语句。但是,如果您尝试使用上面的语句,那么您的printer()功能将不会返回任何内容,这将导致问题。在您的情况下,您不使用printer()的返回值,因此您的代码不会遇到问题。


要删除错误,要么可以:

return 0; // You did this, and you noticed that this resolved the issue

当您返回值0时,这消除了问题(我们使用惯例为0,请纠正我,如果我错了,请为同名)。就像我说的那样,返回值根本不使用,因此,警告已解决。

另外,您也可以将功能标头更改为:

void printer(int *ip) {

这消除了警告,就像现在一样,您的函数返回类型void的值,这是什么都没有的。在您的情况下,这更好,因为您不使用首选语句返回的值0。

最新更新