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

时间:2013-10-03 02:38:24

标签: c

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

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

5 个答案:

答案 0 :(得分: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);
    }

答案 1 :(得分:2)

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

答案 2 :(得分:2)

如果我们查看gcc手册的Warning Options部分,我们会看到-Wreturn-type的以下内容:

  

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

在这种情况下,safe_quad_eval被声明为返回int,但是您没有return语句而从函数的末尾开始。这可能导致未定义的行为,如果您尝试使用此类函数的返回值,则根据C99草案标准部分6.9.1 函数定义 12 说:< / p>

  

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

所以你应该把你的功能改为return一个值。

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

  

-Werror

     
    

将所有警告变为错误。

  

答案 3 :(得分: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);
}

答案 4 :(得分:0)

我假设您要返回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返回值可以纠正错误。