-ansi
là một công tắc lỗi thời mà yêu cầu trình biên dịch để biên dịch theo 30 tuổi phiên bản lỗi thời của chuẩn C , ISO / IEC 9899: 1990 , trong đó chủ yếu là một thương hiệu riêng của các chuẩn ANSI X3.159-1989 "Lập trình ngôn ngữ C . Bởi vì sau khi C90 được xuất bản bởi ISO, ISO đã chịu trách nhiệm về tiêu chuẩn hóa C và bất kỳ chương trình chỉnh sửa kỹ thuật nào đối với C90 đã được ISO xuất bản -std=c90
.
Nếu không có công tắc này, các trình biên dịch GCC C gần đây sẽ tuân thủ ngôn ngữ C được tiêu chuẩn hóa trong ISO / IEC 9899: 2011 hoặc phiên bản 2018 mới nhất.
Thật không may, có một số nhà cung cấp trình biên dịch lười biếng tin rằng có thể chấp nhận việc tuân theo bản sửa đổi tiêu chuẩn cũ hơn, mà tài liệu tiêu chuẩn hóa thậm chí không có sẵn từ các cơ quan tiêu chuẩn.
Sử dụng công tắc giúp đảm bảo rằng mã sẽ được biên dịch trong các trình biên dịch lỗi thời này.
Đây -pedantic
là một trong những thú vị. Trong trường hợp không có -pedantic
, ngay cả khi một tiêu chuẩn cụ thể được yêu cầu, GCC vẫn sẽ cho phép một số tiện ích mở rộng không được chấp nhận trong tiêu chuẩn C. Xem xét ví dụ chương trình
struct test {
int zero_size_array[0];
};
Các C11 dự thảo n1570 đoạn 6.7.6.2p1 nói :
Ngoài các loại vòng loại tùy chọn và từ khóa tĩnh, [và] có thể phân định một biểu thức hoặc *. Nếu họ phân định một biểu thức (xác định kích thước của một mảng), biểu thức sẽ có một kiểu số nguyên. Nếu biểu thức là một biểu thức không đổi, nó sẽ có giá trị lớn hơn 0. [...]
Tiêu chuẩn C yêu cầu độ dài mảng lớn hơn 0; và đoạn này là trong các ràng buộc ; tiêu chuẩn cho biết 5.1.1.3p1 sau đây :
Việc triển khai tuân thủ sẽ tạo ra ít nhất một thông báo chẩn đoán (được xác định theo cách xác định thực hiện) nếu đơn vị dịch hoặc đơn vị dịch tiền xử lý có vi phạm bất kỳ quy tắc cú pháp hoặc ràng buộc nào, ngay cả khi hành vi cũng được xác định rõ ràng là không xác định hoặc thực hiện- xác định. Thông điệp chẩn đoán không cần phải được tạo ra trong các trường hợp khác.9)
Tuy nhiên, nếu bạn biên dịch chương trình với gcc -c -std=c90 pedantic_test.c
, không có cảnh báo nào được tạo ra.
-pedantic
làm cho trình biên dịch thực sự tuân thủ tiêu chuẩn C ; vì vậy bây giờ nó sẽ tạo ra một thông báo chẩn đoán, theo yêu cầu của tiêu chuẩn:
gcc -c -pedantic -std=c90 pedantic_test.c
pedantic_test.c:2:9: warning: ISO C forbids zero-size array ‘zero_size_array’ [-Wpedantic]
int zero_size_array[0];
^~~~~~~~~~~~~~~
Do đó, đối với tính di động tối đa, việc chỉ định sửa đổi tiêu chuẩn là không đủ, bạn cũng phải sử dụng -pedantic
(hoặc -pedantic-errors
) để đảm bảo rằng GCC thực sự tuân thủ thư của tiêu chuẩn.
Phần cuối của câu hỏi là về việc sử dụng -ansi
với C ++ . ANSI không bao giờ tiêu chuẩn hóa ngôn ngữ C ++ - chỉ áp dụng ngôn ngữ này từ ISO, vì vậy điều này có ý nghĩa nhiều như nói "Tiếng Anh theo tiêu chuẩn của Pháp". Tuy nhiên, GCC dường như vẫn chấp nhận nó cho C ++, ngu ngốc như nó nghe.