簡體   English   中英

警告:“並非所有控制路徑都返回值” c ++

[英]Warning : “Not all control paths return a value” c++

我的小功能無法理解此警告:

int Fct_name (int nb1, int * nb2) 
{
    switch (Dest)
    { 
    Case 1 : 
        return Fct_1(nb1,nb2);
    Case 2 :
        return -1;
    }
}

如果有人可以幫助我?

如警告所述,這是因為並非函數的所有路徑都返回值,而函數具有獨特的返回類型,該類型告訴編譯器“嘿,我要返回一些東西”。 但是如果Dest不是1或2,則實際上不執行此操作。


您評論了:

目的地只能是1或2(這是一個枚舉)

是的,但是只有您知道這一點,您的編譯器不會,並且您也不會相信。 它只能看到代碼的靜態屬性,無法預測運行時的運行方式,因此不會接受您的代碼。 就其所知, Dest可以通過外部代碼等進行更改。


您應該添加某種默認值:

int Fct_name (int nb1, int * nb2) 
{
   switch (Dest)
   { 
    case 1 : 
         return Fct_1(nb1,nb2);
    case 2 :
         return -1;
    }
    return 0;
}

如@NathanOliver所說,警告表示在可能的情況下,函數可能不返回任何值。 更准確地說,如果用戶輸入的值不是1或2,則您的函數不會返回任何值。

您可能會認為您只會輸入1或2。但是編譯器不知道這一點。

您可以做的是-

  1. 忽略警告 -您可以忽略警告並繼續前進。 但是請注意,在所有情況下,您都只能將1 o 2作為參數。

盡管我不建議您忽略該警告。 通常,最好注意這些警告。 從長遠來看,如果您正在處理大型項目,它可以避免許多錯誤。

  1. 添加默認值 -此條件實際上不會執行,但是編譯器現在將停止發出警告。

這是更正的代碼-

int Fct_name (int nb1, int * nb2) 
    {
        switch (Dest)
        { 
           case 1 : 
              return Fct_1(nb1,nb2);
           case 2 :
              return -1;
           default:
             return 0;
       }
   }

或者您可以這樣做-

int Fct_name (int nb1, int * nb2) 
{
    switch (Dest)
    { 
       case 1 : 
          return Fct_1(nb1,nb2);
       case 2 :
          return -1;
    }
    return 0;
}

如果dest是僅包含兩個值的枚舉,則無需復雜return Dest == 1 ? Fct_1(nb1,nb2) : -1; return Dest == 1 ? Fct_1(nb1,nb2) : -1; 足夠。 否則,將case 2:替換為default:

如果Dest實際上是您所說的枚舉,則編譯器不應針對您的情況發出警告。 至少我的編譯器沒有。 因此,以下代碼編譯時沒有警告/錯誤:

enum {
  x = 1,
    y = 2
} Dest;

int Fct_name (int nb1, int * nb2)
{
    switch (Dest)
    {
            case 1 :
            return -5; //Fct_1(nb1,nb2);
            case 2 :
            return -1;
    }
}

int main() {

}

但是,如果Dest是整數,或者枚舉定義的值不是12 ,那么我也會得到一個錯誤。 然后可以使用default -path進行修復:

enum {
  x = 1,
    y = 2,
    z = 3
} Dest;

int Fct_name (int nb1, int * nb2)
{
    switch (Dest)
    {
            case 1 :
            return -5; //Fct_1(nb1,nb2);
            case 2 :
            return -1;
        default:
            return 0;
    }
}

如果目標只能是1或2,則可以這樣重寫

int Fct_name (int nb1, int * nb2) 
{
    if(Dest == 1) return Fct_1(nb1,nb2);
    return -1;
}

在函數的末尾添加一個返回XXX,這將確保編譯器不會在沒有返回值的情況下到達函數的末尾。

暫無
暫無

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

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