簡體   English   中英

C,錯誤:控制到達非無效函數的結尾[-Werror,-Wreturn-type]

[英]C, error: control reaches end of non-void function [-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語句。 它應該是return (f(qa,qb..

如果我們查看gcc手冊的警告選項部分,我們會看到以下有關-Wreturn-type

當函數定義的返回類型默認為int時發出警告。 還警告在返回類型不為void的函數中沒有返回值的任何return語句(從函數體末尾開始考慮返回沒有值),以及關於返回類型的函數中帶有表達式的return語句是空的。

在這種情況下, safe_quad_eval被聲明為返回int但是你沒有return語句而沒有函數的結尾。 這可能會導致未定義的行為,如果您嘗試使用此類函數的返回值,則根據C99草案標准部分6.9.1 函數定義12段說:

如果到達終止函數的},並且調用者使用函數調用的值,則行為是未定義的。

因此,您可能應該更改函數以return值。

為了完整起見, -Werror將導致編譯器將警告變為錯誤,從上面鏈接的手冊:

-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返回值可糾正錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM