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

时间:2009-05-30 01:13:56

标签: c++ controls warnings

我得到的确切警告是

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的变量

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

警告意味着什么,以及摆脱它的最佳解决方案是什么?

7 个答案:

答案 0 :(得分:13)

你的编译器不够聪明,不能考虑到side只有leftright的两个选项,所以它认为这两个选项都不可能被执行。如果side既不是left也不是right,则您的函数不会说明要返回的值。

答案 1 :(得分:7)

错误意味着如果side既不是左边也不是右边,你的函数不会返回一个值 - 任何一方声明不正确或你的枚举是。枚举应该定义为

enum orientation {left, right};

因此,请尝试将您的方向结构更改为。

答案 2 :(得分:6)

如果side不是leftright,则返回值未定义。

即使orientation是只包含两个值的枚举(现在),但由于以下任何原因,它仍然可以具有不同的值:

  • 将来,您可以更改标题以在枚举中包含其他值,因此假设这将发生(并且您的编译器很好并且现在警告您)是防御性编程。
  • side可能未初始化,因此它既不是left也不是right
  • side可能已经通过类型转换分配了另一个值,例如*((int*)&side) = 2

可能的解决方案包括:

  • 按照......
  • 的建议,将第二个if替换为else
  • 将其更改为:

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

答案 3 :(得分:4)

警告意味着可以通过您的方法而不返回任何显式值。使用您的代码:

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,那么您不会返回任何内容。解决这个问题的常用方法是假设,例如,如果不是“左”,则总是假设“正确”:

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

答案 4 :(得分:3)

你可以做某些事情,或者,因为在这种情况下,你真的以同样的方式回归......

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

答案 5 :(得分:2)

要删除警告,请将第二个if替换为else

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

答案 6 :(得分:1)

正如其他人所说,问题是您的side可能既不是left也不是right。 您可以修改您的功能以执行以下任何操作:

  1. 将第二个if语句更改为else,或者将所有条件一起删除,因为如果没有左侧,则必须是正确的。
  2. 按照Nathaniel Flath的建议,将方向类型修改为枚举。
  3. 将异常作为函数的最后一个语句引发。