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


Предупреждение компилятора (уровень 1, ошибка, отключение) C5262

неявное падение происходит здесь; вы отсутствуете break заявление? Использование [[fallthrough]] , когда break оператор намеренно опущен между вариантами

Замечания

Поток управления, который неявно падает между случаями инструкций switch, является историческим источником ошибок для C и C++. Хотя у нас был __fallthrough макрос SAL, он не был полезен для диагностика компилятора сборки. Так как клиенты имеют устаревший код, который "попадает" на цель, он не может дать активное предупреждение без какого-либо способа указания намеренного падения. В C++17 [[fallthrough]] атрибут был добавлен для указания такого экземпляра. Компилятор может учитывать этот атрибут и подавлять новое предупреждение.

Предупреждение компилятора C5262 является новым в Visual Studio 2022 версии 17.4 и отключено по умолчанию и рассматривается как ошибка по умолчанию при включении. Чтобы продолжить поддержку устаревшего кода без разрывов сборки, необходимо явно включить C5262. Дополнительные сведения о включении этого предупреждения см . в предупреждениях компилятора, отключенных по умолчанию.

Пример

Пример кода показывает диагностика для switch случаев, которые проходят без break return инструкций или [[fallthrough]] атрибутов.

// 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]].