경고 C26819
스위치 레이블 간에 주석 처리되지 않은 폴스루입니다(es.78).
설명
이 검사는 스위치 문의 암시적 폴스루를 다룹니다. 암시적 폴스루는 [[fallthrough]];
문을 사용하지 않고 제어 흐름이 하나의 스위치 사례에서 다음 스위치 사례로 직접 전송되는 경우입니다. 이 경고는 하나 이상의 문이 포함된 스위치 사례에서 암시적 폴스루가 검색되면 발생합니다.
자세한 내용은 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;
}
}
문제를 해결하는 또 다른 방법은 암시적 폴스루를 제거하는 것입니다.
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;
}
}