Bu kodu düşünün:
void foo()
{
goto bar;
int x = 0;
bar: ;
}
GCC ve Clang bunu reddeder , çünkü bar:
değişken başlatmayı atlar. MSVC (kullanılmasının haricinde hiç şikayet etmiyor x
sonra bar:
nedenleri bir uyarı).
Şununla benzer bir şey yapabiliriz switch
:
void foo()
{
switch (0)
{
int x = 0;
case 0: ;
}
}
Şimdi her üç derleyici de hata yayar .
Bu parçacıklar kötü biçimlendirilmiş mi? Yoksa UB'ye mi neden oluyorlar?
Her ikisinin de kötü biçimlenmiş olduğunu düşünürdüm, ama standardın vahiy kısımlarını bulamıyorum. [stmt.goto] bu konuda hiçbir şey söylemez ve [stmt.select] de söylemez .
/permissive-
Bayrağı MSVC'ye ekleyin, bu da şikayet edecektir. Bu bayrak olmadan MSVC'nin davranışının iyi tanımlanıp tanımlanmadığını bilmiyorum (varsayalım, aksi halde neden buna izin vereceklerdi?).
x
Atlamadan sonra kullanırsanız sorun daha önemsiz olurdu .