พิจารณารหัสนี้:
void foo()
{
goto bar;
int x = 0;
bar: ;
}
GCC และ Clang ปฏิเสธเนื่องจากการข้ามไปยังการbar:
ข้ามการกำหนดค่าเริ่มต้นของตัวแปร MSVC ไม่บ่นเลย (ยกเว้นการใช้x
หลังจากbar:
ทำให้เกิดการเตือน)
เราสามารถทำสิ่งเดียวกันด้วยswitch
:
void foo()
{
switch (0)
{
int x = 0;
case 0: ;
}
}
ตอนนี้ทั้งสามคอมไพเลอร์ปล่อยข้อผิดพลาด
ตัวอย่างเหล่านั้นไม่ดีหรือไม่ หรือพวกเขาทำให้ UB?
ฉันเคยคิดว่าทั้งสองรูปแบบไม่ดี แต่ฉันไม่สามารถหาส่วนที่น่ารำคาญของมาตรฐาน [stmt.goto]ไม่ได้พูดอะไรเกี่ยวกับเรื่องนี้และไม่ไม่[stmt.select]
/permissive-
ตั้งค่าสถานะเพื่อ MSVC และมันจะบ่นเช่นกัน ฉันไม่ทราบว่าพฤติกรรมของ MSVC ที่ไม่มีธงนั้นมีการกำหนดไว้อย่างดีหรือไม่ (ฉันจะถือว่าเป็นอย่างอื่น
x
หลังจากการกระโดด