2
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);
}

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

4

5 回答 5

2

函数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);
    }
于 2013-10-03T02:40:19.300 回答
2

safe_quad_eval()没有返回语句。它应该是return (f(q.a,q.b...吗?

于 2013-10-03T02:40:35.887 回答
2

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

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

在这种情况下safe_quad_eval,声明为返回int,但您在没有return语句的情况下退出函数的末尾。这可能会导致未定义的行为,如果您尝试按照 C99 草案标准部分6.9.1 函数定义12段所述使用此类函数的返回值:

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

因此,您可能应该将函数更改为return一个值。

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

-错误

将所有警告变成错误。

于 2013-10-03T03:15:50.173 回答
1

int函数开头的表示safe_quad_eval它应该返回一个整数值。但是,正如您编写的那样,它实际上并没有返回任何东西(它没有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);
}
于 2013-10-03T02:41:25.257 回答
0

我假设你想返回值,safe_quad_eval因为返回类型被声明为 an 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返回值可纠正错误。

于 2013-10-03T02:41:16.650 回答