Tôi đã chơi với một số cú pháp và tìm thấy một số quy tắc biên dịch lạ, đã tự hỏi những gì các lập luận là choC vs C++ định nghĩa biến câu lệnh switch vs khai
C này sẽ không biên dịch này nhưng C++ sẽ:
switch (argc) {
case 0:
int foo;
break;
default:
break;
}
Cả C và C++ sẽ biên dịch này:
switch (argc) {
case 0:
; int foo;
break;
default:
break;
}
C sẽ biên dịch này nhưng không phải C++:
switch (argc) {
case 0:
; int foo = 0;
break;
default:
break;
}
gcc -v
là gcc version 4.9.3 (MacPorts gcc49 4.9.3_0)
nếu vấn đề. Tôi nhận ra giải pháp là để bọc các nội dung của case 0:
với dấu ngoặc nhọn, nhưng tôi quan tâm nhiều hơn trong lập luận cho lỗi biên dịch
[Câu trả lời này] (http://stackoverflow.com/a/92730/962089) có phần liên quan. – chris
Dường như trường hợp thứ hai vẫn hoạt động với C++ nếu bạn đặt 'foo' trong câu lệnh bổ sung. gcc chỉ phàn nàn về biến không sử dụng trong [ví dụ này] (http://coliru.stacked-crooked.com/a/ba80bc1da97d8212), và clang là tốt với nó. – jaggedSpire
@chris, Cảm ơn, trường hợp thứ ba có ý nghĩa bây giờ (không thể nhảy qua khởi tạo trong C++) – asimes