2012-05-16 9 views
98

Sự khác biệt giữa -std=c++11-std=gnu++11 là thông 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.Sự khác biệt giữa -std = C++ 11 và -std = gnu ++ 11 là gì?

Tôi đã đọc ở đâu đó rằng nó phải làm với một số phần mở rộng nhưng nó không phải là rõ ràng cho tôi những cái nào và làm thế nào để lựa chọn giữa một hoặc khác cho một dự án mới.

+5

Những thứ 'gnu' tham chiếu đến tiện ích mở rộng và nếu bạn muốn viết mã di động, bạn phải tuân theo tiêu chuẩn và tránh hoàn toàn tiện ích mở rộng. – juanchopanza

Trả lời

66

Như bạn đã phát hiện ra chính mình, sự khác biệt giữa hai tùy chọn là liệu các phần mở rộng GNU vi phạm tiêu chuẩn C++ có được bật hay không. Các phần mở rộng GNU được mô tả here. Lưu ý rằng một số tiện ích 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.

Ví dụ, 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. Tuy nhiên, miễn là bạn không sử dụng bất kỳ thiết bị nào trong số đó, bạn nên sử dụng chuẩn này mà không cần phần mở rộng cho 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

Trong nhiều trường hợp, các tiện ích mở rộng không vi phạm tiêu chuẩn –

+2

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ể theo Chuẩn ... nhưng thậm chí sau đó, "vi phạm" là lạ và được tải thuật ngữ, khi rất nhiều các phần mở rộng này, sử dụng Standardese, chỉ _implementation-defined_ hoặc _specifying_ những thứ mà Standard im lặng - hoặc thậm chí là tất cả các phần mở rộng ... Bạn có một trích dẫn cho bất kỳ phần mở rộng GNU nào vi phạm Tiêu chuẩn bằng cách làm một cái gì đó khác với một điều tiêu chuẩn xác định rõ ràng? –

+4

Trong khi câu trả lời này là một câu trả lời chung tốt, bạn có cân nhắc chỉnh sửa nó để ít nhất liệt kê các phần mở rộng được kích hoạt trong 'gnu11' nhưng không phải trong' C++ 11'? Danh sách bạn liên kết là của tất cả các phần mở rộng, và như bạn tự cho biết một số trong số chúng được kích hoạt với 'C++ 11' là tốt (như' __restrict__'). – einpoklum