Sự khác biệt giữa -std = c ++ 11 và -std = gnu ++ 11 là gì?


132

Sự khác biệt giữa -std=c++11-std=gnu++11như là tham số biên dịch cho gcc và clang là gì? Cùng một câu hỏi với c99gnu99? Tôi biết về các tiêu chuẩn C ++ và C, đó là sự khác biệt trong các tham số mà tôi quan tâm.

Tôi đã đọc ở đâu đó rằng nó phải làm với một số tiện ích mở rộng nhưng tôi không rõ là cái nào và cách chọn giữa cái này hay cái kia cho một dự án mới.


5
Những gnucái đó đề cập đến các phần mở rộng, và nếu bạn muốn viết mã di động, bạn nên tuân thủ một tiêu chuẩn và tránh các phần mở rộng hoàn toàn.
juanchopanza

Câu trả lời:


91

Như bạn đã tự tìm ra, sự khác biệt giữa hai tùy chọn là liệu các phần mở rộng GNU có vi phạm / mở rộng chuẩn C ++ có được bật hay không. Các phần mở rộng GNU C ++ được mô tả ở đây . Bạn cũng có thể sử dụng hầu hết các phần mở rộng GNU C (được mô tả ở đây ) trong các chương trình C ++ của bạn. Nó cũng sẽ hữu ích để đọc về -Wpedantictùy chọn GCC ở đây .

Lưu ý rằng một số tiện ích mở rộng vẫn có thể có hiệu lực khi sử dụng -std=c++11, miễn là chúng không mâu thuẫn với tiêu chuẩn. Chẳng hạn, khi sử dụng trình biên dịch MinGW, tôi cần các phần mở rộng để làm việc Boost.Lexical_Cast. Nhưng, miễn là bạn không sử dụng bất kỳ ứng dụng nào trong số đó, tốt hơn hết bạn nên tuân thủ tiêu chuẩn mà không cần tiện ích mở rộng để có tính di động tối đa. Điều này có thể có ích nếu bạn thấy mình bị buộc phải thay đổi trình biên dịch.


4
Vâng, tôi tránh các tiện ích mở rộng vì tôi không khuyên bạn nên làm bất cứ điều gì không được xác định cụ thể bởi Tiêu chuẩn ... nhưng ngay cả khi đó, "vi phạm" là một thuật ngữ lạ và được tải, khi có rất nhiều tiện ích mở rộng này, sử dụng Standardese , chỉ xác định thực hiện hoặc chỉ định những điều mà Tiêu chuẩn im lặng - hoặc thậm chí là tất cả các tiện ích mở rộng ... Bạn có trích dẫn cho bất kỳ tiện ích mở rộng GNU nào vi phạm Tiêu chuẩn bằng cách thực hiện điều gì đó khác với điều mà Tiêu chuẩn xác định rõ ràng không?
gạch dưới

9
Mặc dù câu trả lời này là một câu hỏi hay, nhưng bạn có cân nhắc chỉnh sửa nó để ít nhất liệt kê các tiện ích mở rộng được kích hoạt gnu11nhưng không có trong c++11không? Danh sách bạn liên kết đến là của tất cả các tiện ích mở rộng và như chính bạn chỉ ra một số trong số chúng cũng được bật c++11(như __restrict__).
einpoklum

Những gì tôi phát hiện ra bây giờ và sẽ không bao giờ kết luận bằng cách xem tài liệu về các cờ, như sau: -std = c ++ 11 kích hoạt lại các biểu tượng -std = gnu ++ 11 bỏ qua chúng và phát ra cảnh báo, giống như nó làm gì khi bỏ qua -std hoàn toàn
Daniel82
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.