簡體   English   中英

“警告:並非所有控制路徑都返回值”是什么意思? (C ++)

[英]What does “warning: not all control paths return a value” mean? (C++)

我得到的確切警告是

warning C4715: 'hand::show' : not all control paths return a value

和hand :: show是

std::ostream& hand::show(std::ostream& os) const
{
    if(side == left)
    {
        return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4];
    }
    if(side == right)
    {
        return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0];
    }
}

其中side是類型方向的變量

orientation{
    left = -1,
    right = 1
};

該警告是什么意思,擺脫該警告的最佳解決方案是什么?

您的編譯器不夠聰明,無法考慮到side的僅有兩個選項為leftright ,因此它認為不可能執行兩個return語句。 side既不left也不right ,您的函數不說要返回哪個值。

該錯誤意味着如果side既不左也不右,則您的函數將不會返回值-任一側聲明不正確,或者您的枚舉是正確的。 枚舉應定義為

enum orientation {left, right};

因此,嘗試將定向結構更改為該定向結構。

如果side不是leftright ,則返回值是不確定的。

盡管orientation是一個只有兩個值的枚舉(現在),但由於以下任何原因,它仍然可以具有不同的值:

  • 將來,您可能會更改標頭以在枚舉中包含其他值,因此假定這會發生(這是您的編譯器很好並且現在警告您),這是一種防御性編程。
  • side可能是未初始化的,所以它可能是既不left也不right
  • 可能已經通過類型轉換為side分配了另一個值,例如*((int*)&side) = 2

可能的解決方案包括:

  • 根據sth的建議,將第二個if替換為else
  • 更改為:

     if(side == left) { return ...; } else if(side == right) { return ...; } else { ...handle error... } 

警告表示可以在不返回任何顯式值的情況下遍歷您的方法。 使用您的代碼:

std::ostream& hand::show(std::ostream& os) const
{
    if(side == left)
    {
        return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4];
    }
    if(side == right)
    {
        return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0];
    }
}

如果side != leftside != right ,那么您什么也不返回。 解決此問題的常用方法是假設,例如,如果不是“ left”,則始終假設“ right”:

std::ostream& hand::show(std::ostream& os) const
{
    if(side == left)
    {
        return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4];
    }
    return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0];
}

您可以按照說的去做,或者,因為在這種情況下,您實際上是通過兩種方式返回相同的內容...

std::ostream& hand::show(std::ostream& os) const
{
    if(side == left)
    {
        os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4];
    }
    else
    {
        os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0];
    }
    return os;
}

要消除警告, ifelse替換第二個if

std::ostream& hand::show(std::ostream& os) const
{
    if(side == left)
    {
        return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4];
    }
    else
    {
        return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0];
    }
}

正如其他人所暗示的那樣,問題是您的side可能既不left也不right
您可以修改函數以執行以下任一操作:

  1. 將第二個if語句更改為else,或者一起刪除條件,因為如果不保留該邊,那么它一定是正確的。
  2. 按照Nathaniel Flath的建議,將方向類型修改為枚舉。
  3. 引發異常作為函數的最后一條語句。

暫無
暫無

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

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