Xem xét mã này:
void foo()
{
goto bar;
int x = 0;
bar: ;
}
GCC và Clang từ chối nó , bởi vì bước nhảy bar:
bỏ qua việc khởi tạo biến. MSVC hoàn toàn không phàn nàn (ngoại trừ việc sử dụng x
sau khi bar:
gây ra cảnh báo).
Chúng ta có thể làm một điều tương tự với một switch
:
void foo()
{
switch (0)
{
int x = 0;
case 0: ;
}
}
Bây giờ cả ba trình biên dịch phát ra lỗi .
Là những đoạn mã không thành hình? Hay họ gây ra UB?
Tôi đã từng nghĩ rằng cả hai đều không thành hình, nhưng tôi không thể tìm thấy những phần khải thị của tiêu chuẩn. [stmt.goto] không nói bất cứ điều gì về vấn đề này, và cũng như thế [stmt.select] .
/permissive-
cờ vào MSVC và nó cũng sẽ khiếu nại. Mặc dù tôi không biết liệu hành vi của MSVC không có cờ đó có được xác định rõ hay không (tôi sẽ cho là như vậy, nếu không thì tại sao họ lại cho phép?).
x
sau khi nhảy.