Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
występuje tutaj niejawny upadek; Czy brakuje instrukcji
break? Użyj[[fallthrough]], gdybreakinstrukcja jest celowo pomijana między przypadkami
Uwagi
Przepływ sterowania, który niejawnie mieści się między przypadkami instrukcji przełącznika, jest historycznym źródłem usterek zarówno dla języka C, jak i C++. Chociaż mieliśmy __fallthrough makro SAL, nie było przydatne w diagnostyce kompilatora kompilacji. Ponieważ klienci mają starszy kod, który "przechodzi" celowo, nie jest opłacalne, aby dać ostrzeżenie z możliwością działania bez wskazywania zamierzonego upadku. W języku C++17 dodano atrybut w [[fallthrough]] celu wskazania takiego wystąpienia. Kompilator może uwzględnić ten atrybut i pominąć nowe ostrzeżenie.
Ostrzeżenie kompilatora C5262 jest nowe w programie Visual Studio 2022 w wersji 17.4 i jest domyślnie wyłączone i traktowane jako błąd domyślnie po włączeniu. Aby nadal obsługiwać starszy kod bez przerw kompilacji, należy jawnie włączyć język C5262. Aby uzyskać więcej informacji na temat włączania tego ostrzeżenia, zobacz Ostrzeżenia kompilatora, które są domyślnie wyłączone.
Przykład
Przykładowy kod przedstawia diagnostykę przypadków switch , które przechodzą bez break instrukcji lub return lub atrybutu [[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++;
*/
Aby rozwiązać ten problem, gdy przepływ sterowania między przypadkami jest zamierzony, użyj atrybutu [[fallthrough]] .