다음을 통해 공유


컴파일러 경고(수준 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]] .

참고 항목

switch 문(C++)
[[fallthrough]] 특성