C,错误:控制到达非空函数的末尾[-Werror,-Wreturn-type]


struct quad {
int a;
int b;
int c;
}
int f(const int a, const int b, const int c, const int x){
  const int l = a*x*x + b*x + c;
  return l;
}
int safe_quad_eval(const struct quad q, const int x){
  (f(q.a,q.b,q.c,x)>INT_MAX)||(f(q.a,q.b,q.c,x)<(-INT_MAX)) ? INT_MIN : f(q.a,q.b,q.c,x);
}

我不确定这个错误是什么意思? 以及如何解决它?

>函数int safe_quad_eval(...)没有返回值。

您需要返回一个 int。

也许你想要

int safe_quad_eval(const struct quad q, const int x){
    return (f(q.a,q.b,q.c,x)>INT_MAX)||(f(q.a,q.b,q.c,x)<(-INT_MAX)) ? INT_MIN : f       (q.a,q.b,q.c,x);
    }
safe_quad_eval()没有

返回语句。应该是return (f(q.a,q.b...吗?

如果我们查看gcc手册的"警告选项"部分,我们会看到以下内容-Wreturn-type

每当使用默认为 int 的返回类型定义函数时发出警告。还要警告返回类型不为 void 的函数中任何没有返回值的 return 语句(从函数体末尾掉落被视为返回没有值(,以及返回类型为 void 的函数中带有表达式的 return 语句。

在这种情况下,safe_quad_eval被声明为返回int但你从函数的末尾掉下来,没有return语句。这可能会导致未定义的行为,因为您尝试根据 C99 草案标准部分使用此类函数的返回值 6.9.1 函数定义12 段说:

如果到达终止函数的 },并且调用方使用函数调用的值,则行为未定义。

因此,您可能应该更改函数以return值。

为了完整起见,-Werror将导致编译器将警告转换为错误,来自上面链接的手册:

-错误

将所有警告变成错误。

函数

safe_quad_eval开头的int表示它应该返回一个整数值。但是,正如您编写的那样,它实际上并没有返回任何内容(其中没有return语句(。

要解决此问题,请在其正文的开头添加return

int safe_quad_eval(const struct quad q, const int x){
    return (f(q.a,q.b,q.c,x)>INT_MAX)||(f(q.a,q.b,q.c,x)<(-INT_MAX)) ? INT_MIN : f(q.a,q.b,q.c,x);
}

我假设您想在safe_quad_eval中返回值,因为返回类型被声明为 int ,但您忘记了 return 语句。添加return应该可以阻止编译器抱怨。

int safe_quad_eval(const struct quad q, const int x){
  return (f(q.a,q.b,q.c,x)>INT_MAX)||(f(q.a,q.b,q.c,x)<(-INT_MAX)) ? INT_MIN : f(q.a,q.b,q.c,x);
}

error: control reaches end of non-void function 表示函数被声明为非 void(在这种情况下safe_quad_eval期望int返回值(,但您没有从中返回值。添加 int 返回值可更正错误。

相关内容

最新更新