次の方法で共有


コンパイラの警告 (レベル 1、エラー、オフ) C5262

ここで暗黙的なフォールスルーが発生します。break ステートメントが不足している可能性があります break ステートメントがケース間で意図的に省略された場合は [[fallthrough]] を使用します

解説

switch ステートメントのケース間で暗黙的に発生する制御フローは、C と C++ の両方のバグの履歴ソースです。 __fallthrough SAL マクロはありましたが、ビルド コンパイラの診断には役立ちませんでした。 お客様には、意図的に "通過" するレガシ コードがあるため、意図的なフォールスルーを何らかの方法で示さなければ、実用的な警告を出すことはできません。 C++17 では、このようなインスタンスを示すために [[fallthrough]] 属性が追加されました。 コンパイラはこの属性を考慮に入れ、新しい警告を抑制できます。

コンパイラ警告 C5262 は Visual Studio 2022 バージョン 17.4 の新機能であり、既定ではオフになっており、有効にすると既定でエラーとして扱われます。 ビルドを中断せずにレガシ コードを引き続きサポートするには、C5262 を明示的に有効にする必要があります。 この警告を有効にする方法については、「既定で無効になっているコンパイラ警告」を参照してください。

このサンプル コードは、breakステートメントやreturnステートメントや[[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]] 属性