Поделиться через


Предупреждение C26819

Неотменованное резервное руководство между метками коммутатора (es.78).

Замечания

Эта проверка охватывает неявное резервное руководство в инструкциях switch. Неявное резервное руководство заключается в том, что поток управления передается из одного варианта переключения непосредственно в следующий вариант коммутатора без использования инструкции [[fallthrough]]; . Это предупреждение возникает при обнаружении неявного резервного руководства в случае коммутатора, содержащего по крайней мере одну инструкцию.

Дополнительные сведения см. в статье ES.78. Не опирайтесь на неявное резервное руководство в инструкциях, приведенных в switch основных рекомендациях C++ .

Пример

В этом примере неявное резервное руководство происходит из неявного в 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;
    }
}

См. также

ES.78: не полагаться на неявное резервное руководство в switch инструкциях