控制到达非void函数未定义行为的结束

时间:2014-03-08 11:26:22

标签: c++ enums return switch-statement undefined-behavior

对于此代码:

enum class Colors { Red, Green, Blue };

int fun(Colors color)
{
    switch (color)
    {
        case Colors::Red: return 0;
        case Colors::Blue: return 1;
        case Colors::Green: return 2;
    }
}

我的编译器向我抛出了这个错误:

warning: control reaches end of non-void function [-Wreturn-type]

我知道在函数中没有return语句是未定义的行为,但是对于所有控制路径没有return语句是未定义的行为吗?提前谢谢。

3 个答案:

答案 0 :(得分:0)

原因是您使用不正确的值调用了fun函数,而不是红色,蓝色或绿色。您可以将代码更改为

int fun(Colors color)
{
    switch (color)
    {
        case Colors::Red: return 0;
        case Colors::Blue: return 1;
        case Colors::Green: return 2;
        default: return -1; // Unknown color here!
    }
}

答案 1 :(得分:0)

在您的情况下,fun的返回值不是void,所以,是的,它是未定义的行为。

  

C ++ 11 6.6.3 return语句

     

[...]离开函数末尾相当于没有值的返回;这会导致值返回函数中的未定义行为。

答案 2 :(得分:-1)

如果函数返回return,则在函数中没有void语句是可以的。但是,对于函数 not 返回void,它始终是未定义的行为,因为没有来自任何执行路径的有效返回值。

因此,在您的情况下,您需要return之后的值为switch

请注意,如果您在default声明中列出所有可能的案例,则不需要switch个案例。