编译器警告(等级 1,错误,关闭)C5262

此处发生隐式下沉;是否缺少 break 语句? 在事例之间有意省略 break 语句时使用 [[fallthrough]]

备注

在 switch 语句的事例之间隐式下沉的控制流是 C 和 C++ 的 bug 的历史来源。 虽然我们有 __fallthrough SAL 宏,但它对内部版本编译器诊断并无用处。 由于客户的旧代码是故意“下沉”的,因此若未通过某种方式指示有意下沉,提供可操作的警告则是不可行的。 在 C++17 中,添加了 [[fallthrough]] 属性以指示这种情况。 编译器可以将此属性纳入考量范围,并取消新的警告。

编译器警告 C5262 是 Visual Studio 2022 版本 17.4 中的新增功能,默认情况下处于关闭状态,在启用的情况下默认被视为错误。 若要在不中断内部版本的情况下继续支持旧代码,必须显式启用 C5262。 有关如何启用此警告的详细信息,请参阅默认情况下关闭的编译器警告

示例

该示例代码显示在没有 breakreturn 语句或者 [[fallthrough]] 属性的情况下下沉的 switch 事例的诊断。

// C5262.cpp
// compile using /std:c++17 /we5262

int main(int argc, char** argv)
{
    switch (argc)
    {
        case 0: ++argv;
        case 1:
        case 2: argv++;
        default:
            argv = 0;
    }
}

/*
When built, the compiler produces this output:

.\C5262.cpp(9,9): error C5262: implicit fall-through occurs here; are you missing a break statement? Use [[fallthrough]] when a break statement is intentionally omitted between cases
        case 1:
        ^
.\C5262.cpp(8,17): note: statement that may fall through is here
        case 0: ++argv;
                ^
.\C5262.cpp(11,9): error C5262: implicit fall-through occurs here; are you missing a break statement? Use [[fallthrough]] when a break statement is intentionally omitted between cases
        default:
        ^
.\C5262.cpp(10,17): note: statement that may fall through is here
        case 2: argv++;
*/

若要在事例之间的控制流是有意的情况下解决此问题,请使用 [[fallthrough]] 属性。

另请参阅

switch 语句 (C++)
[[fallthrough]] 属性