警告 C26819
switch ラベルどうしの間に、注釈の付いていないフォールスルーがある (es.78)。
解説
このチェックでは、switch ステートメントの暗黙的なフォールスルーが対象となります。 暗黙的なフォールスルーは、[[fallthrough]];
ステートメントを使用せずに、制御フローが 1 つのスイッチ ケースから次のスイッチ ケースに直接転送される場合です。 この警告は、少なくとも 1 つのステートメントを含むスイッチ ケースで暗黙的なフォールスルーが検出されると発生します。
詳細については、C++ Core Guidelines の「ES.78: switch
ステートメント内の暗黙的なフォールスルーに依存しない」を参照してください。
例
このサンプルでは、空ではない switch
case
から直後の case
への暗黙的なフォールスルーが発生します。
void fn1();
void fn2();
void foo(int a)
{
switch (a)
{
case 0: // implicit fallthrough from case 0 to case 1 is OK because case 0 is empty
case 1:
fn1(); // implicit fallthrough from case 1 into case 2
case 2: // Warning C26819.
fn2();
break;
default:
break;
}
}
この問題を解決するには、フォールスルーが発生する場所に [[fallthrough]];
ステートメントを挿入します。
void fn1();
void fn2();
void foo(int a)
{
switch (a)
{
case 0:
case 1:
fn1();
[[fallthrough]]; // fallthrough is explicit
case 2:
fn2();
break;
default:
break;
}
}
この問題を解決するもう 1 つの方法は、暗黙的なフォールスルーを削除することです。
void fn1();
void fn2();
void foo(int a)
{
switch (a)
{
case 0:
case 1:
fn1();
break; // case 1 no longer falls through into case 2
case 2:
fn2();
break;
default:
break;
}
}