2012-11-30 34 views
5

Tôi chạy vào một vấn đề thời gian gần đây mà ví dụ đồ chơi sau biên dịch sạch sử dụng clang -ansi:'kêu vang mở rộng -ansi`

int main(void) 
{ 
    for (int i = 0; 0;); 
    return i; 
} 

nhưng gcc -ansi cung cấp cho các lỗi sau:

a.c: In function ‘main’: 
a.c:3:5: error: ‘for’ loop initial declarations are only allowed in C99 mode 
a.c:3:5: note: use option -std=c99 or -std=gnu99 to compile your code 

Biên soạn với clang -ansi -pedantic show rằng một phần mở rộng C99 đang được sử dụng.

a.c:3:10: warning: variable declaration in for loop is a C99-specific feature [-pedantic,-Wc99-extensions] 
    for (int i = 0; 0;); 
     ^
1 warning generated. 

Tiện ích mở rộng nào khác cho phép tùy chọn -ansi? Làm thế nào tôi có thể vô hiệu hóa chúng?

+0

Tôi chỉ cách đây vài phút chạy vào một vấn đề tương tự: clang cho phép biến được xác định sau mã thực thi trong cùng một khối - hợp pháp trong C99 nhưng phải là bất hợp pháp trong ANSI. – cdarke

+0

Ví dụ đầy đủ ở trên cũng là bất hợp pháp trong C99, vì 'i' không được định nghĩa khi nó được sử dụng trong câu lệnh trả về. Clang và GCC đồng ý về điều này. Dường như cách sử dụng cụ thể này của phần mở rộng C99 làm cho nó hợp pháp. – cyang

+0

bạn đã đúng, tôi đã không phát hiện ra rằng trong mã OPS (tập trung quá nhiều vào các vấn đề của riêng tôi). – cdarke

Trả lời

4

Nếu bạn đang cố vô hiệu hóa các tiện ích ở chế độ -ansi, thì bạn muốn các cảnh báo này được coi là lỗi: sử dụng -pedantic-errors thay vì -pedantic hoặc -Werror (hoặc cả hai). Để kiểm soát chi tiết hơn lỗi, hãy xem Clang manual.

+0

Cảm ơn. Có vẻ như danh sách các phần mở rộng được kích hoạt trong chế độ '-ansi' là không tồn tại. – cyang

Các vấn đề liên quan