컴파일러 경고(수준 1, 오류, 꺼짐) C5262
여기서 암시적 폴스루(fall-through)가 발생합니다.
break
문이 누락되었나요? 사례 간에break
문이 의도적으로 생략된 경우[[fallthrough]]
를 사용합니다.
설명
switch 문의 경우 사이에 암시적으로 속하는 제어 흐름은 C 및 C++에 대한 버그의 기록 소스입니다. SAL 매크로가 __fallthrough
있었지만 빌드 컴파일러 진단에는 유용하지 않았습니다. 고객은 의도적으로 "통과"하는 레거시 코드를 가지고 있으므로 의도적인 장애를 나타내는 방법 없이는 실행 가능한 경고를 제공할 수 없습니다. C++17에서는 이러한 인스턴스를 [[fallthrough]]
나타내기 위해 특성이 추가되었습니다. 컴파일러는 이 특성을 고려하여 새 경고를 표시하지 않을 수 있습니다.
컴파일러 경고 C5262는 Visual Studio 2022 버전 17.4의 새로운 기능이며, 기본적으로 꺼져 있으며 사용하도록 설정하면 기본적으로 오류로 처리됩니다. 빌드 중단 없이 레거시 코드를 계속 지원하려면 C5262를 명시적으로 사용하도록 설정해야 합니다. 이 경고를 사용하도록 설정하는 방법에 대한 자세한 내용은 기본적으로 꺼져 있는 컴파일러 경고를 참조하세요.
예시
샘플 코드는 문이나 return
특성 없이 break
발생하는 사례에 [[fallthrough]]
대한 switch
진단을 보여 줍니다.
// 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]]
.