พิจารณารหัสนี้:
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หลังจากการกระโดด