Pertimbangkan kode ini:
void foo()
{
goto bar;
int x = 0;
bar: ;
}
GCC dan Dentang menolaknya , karena lompatan untuk bar:mem - bypass inisialisasi variabel. MSVC tidak mengeluh sama sekali (kecuali menggunakan xsetelah bar:menyebabkan peringatan).
Kita dapat melakukan hal serupa dengan switch:
void foo()
{
switch (0)
{
int x = 0;
case 0: ;
}
}
Sekarang ketiga kompiler memancarkan kesalahan .
Apakah potongan-potongan itu buruk bentuknya? Atau apakah mereka menyebabkan UB?
Dulu saya berpikir bahwa keduanya buruk bentuknya, tetapi saya tidak dapat menemukan bagian-bagian standar yang jelas. [stmt.goto] tidak mengatakan apa-apa tentang ini, dan begitu pula [stmt.select] .
/permissive-bendera ke MSVC dan itu akan mengeluh juga. Saya tidak tahu apakah perilaku MSVC tanpa bendera itu didefinisikan dengan baik (saya akan berasumsi demikian, kalau tidak mengapa mereka mengizinkannya?).
xsetelah lompat.