Aracılığıyla paylaş


Derleyici uyarısı (düzey 1, hata, kapalı) C5262

örtük düşüş burada gerçekleşir; bir break ifadeniz eksik mi? Durumlar arasında bir break deyim kasıtlı olarak atlandığında kullanın [[fallthrough]]

Açıklamalar

Anahtar deyimleri durumları arasında örtük olarak yer alan denetim akışı, hem C hem de C++ için hataların geçmiş kaynağıdır. SAL makromuz __fallthrough olsa da derleme derleyicisi tanılaması için kullanışlı değildi. Müşteriler kasıtlı olarak "geçen" eski kodlara sahip olduğundan, kasıtlı bir düşüşü belirtmeden eyleme dönüştürülebilir bir uyarı vermek uygun değildir. C++17'de, [[fallthrough]] böyle bir örneği göstermek için özniteliği eklendi. Derleyici bu özniteliği hesaba katabilir ve yeni uyarıyı gizler.

Derleyici uyarısı C5262, Visual Studio 2022 sürüm 17.4'te yenidir ve hem varsayılan olarak kapalıdır hem de etkinleştirildiğinde varsayılan olarak hata olarak değerlendirilir. Derleme sonları olmadan eski kodu desteklemeye devam etmek için C5262'nin açıkça etkinleştirilmesi gerekir. Bu uyarıyı etkinleştirme hakkında daha fazla bilgi için bkz . Varsayılan olarak kapalı olan derleyici uyarıları.

Örnek

Örnek kod, veya deyimleri veya return [[fallthrough]] özniteliği olmadan break geçen durumlar için switch tanılamayı gösterir.

// 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++;
*/

Servis talepleri arasındaki denetim akışı kasıtlı olduğunda bu sorunu çözmek için özniteliğini [[fallthrough]] kullanın.

Ayrıca bkz.

switch deyimi (C++)
[[fallthrough]] Öznitelik