使用switch语句在函数中没有返回

use*_*005 5 c++ return function switch-statement

我正在使用较旧的 gcc 版本(如果我没记错的话是 7.something)在 LINUX 中开发一个应用程序。最近我尝试在 Windows 上运行相同的应用程序。在 Windows 上,我使用 MinGW 作为编译器(使用 gcc 8.1.0)。

我在 Windows 上编译我的应用程序时遇到了这个错误消息:

警告:控制到达非空函数的结尾 [-Wreturn-type]

代码类似于以下内容:

class myClass {
protected:
    enum class myEnum{
        a,
        b,
    };

    int fun(myClass::myEnum e);
}
Run Code Online (Sandbox Code Playgroud)

int myClass::fun(myClass::myEnum e) {
    switch (e){
        case myEnum::a:{
            return 0;
        }
        case myEnum::b:{
            return 1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我明白错误消息的意思,我只是想知道为什么它在 LINUX 中从来都不是问题。

这段代码真的有问题吗,我是否必须添加一些虚拟的 return 语句?

这个函数是否有一个分支会导致没有返回语句?

Ser*_*eyA 4

这是g++静态分析器的一个缺点。它没有意识到所有枚举值都在 switch 语句中正确处理。

您可以在此处注意到https://godbolt.org/z/LQnBNi,clang不会对其当前形状的代码发出任何警告,并发出两个警告(“并非所有枚举值都在 switch 中处理”和“控制范围”)当另一个值添加到枚举中时,非 void 函数的结尾”)。

请记住,编译器诊断没有以任何方式标准化 - 编译器可以自由地报告符合代码的警告,并报告格式错误的程序的警告(并编译!)。

  • @user7431005 是的,如果您向枚举添加新值,您将收到另一个警告,指出并非所有枚举值都在“switch”中处理。您可以像其他答案一样使用 __builtin_unreachable()` 来使其静音。 (2认同)