C26819

스위치 레이블(es.78) 간의 주석이 지정되지 않은 대체입니다.

설명

이 검사는 switch 문의 암시적 대체를 다룹니다. 암시적 대체는 제어 흐름이 문을 사용하지 않고 한 스위치 케이스에서 다음 스위치 사례로 직접 전송되는 [[fallthrough]]; 경우입니다. 이 경고는 하나 이상의 문을 포함하는 스위치 사례에서 암시적 대체가 검색될 때 발생합니다.

자세한 내용은 ES.78: C++ 핵심 지침의 문에서 switch 암시적 대체를 사용하지 마세요 .

예제

이 샘플에서 암시적 대체는 비어 있지 않은 스위치 사례에서 다음 사례로 발생합니다.

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:
            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;
    }
}