2013-04-14 48 views
11

Tôi muốn sử dụng một số tính năng C++ 11 trong chương trình của mình. Tôi có thể phải chia sẻ mã nguồn của mình với những người khác trong tương lai. Làm thế nào để khẳng định, bên trong mã, C++ 11 nên được sử dụng để biên dịch chương trình của tôi? Trình biên dịch cũ hơn có thể ném lỗi, nhưng tôi muốn người dùng được thông báo rõ ràng rằng C++ 11 là bắt buộc.Làm thế nào để khẳng định rằng C++ 11 nên được sử dụng để biên dịch chương trình của tôi?

Tôi đang sử dụng C++ 11 tính năng sau đây, nếu có vấn đề:

  • enum với kích thước lưu trữ theo quy định
  • std chia sẻ con trỏ

nhờ

+4

'static_assert (true);'. (Tôi đang nói đùa. Đừng làm điều này.) – jamesdlin

+0

Lưu ý rằng tại thời điểm viết bài, không có trình biên dịch hỗ trợ đầy đủ C++ 11.Vì vậy, nếu bạn thử nghiệm hỗ trợ hoàn chỉnh C++ 11, bạn sẽ có rất nhiều âm bản sai - trình biên dịch có các tính năng bạn cần nhưng không thực hiện C++ 11 và do đó bị từ chối bởi thử nghiệm của bạn. –

+0

@SteveJessop Tôi có ấn tượng rằng GCC đã hỗ trợ tất cả các tính năng của C++ 11 theo [bảng này] (http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport). Nếu tôi sai, xin hãy sửa tôi. – Malcolm

Trả lời

22

Bạn có thể kiểm tra xem giá trị của __cplusplus vĩ mô là 201103L hoặc cao hơn:

#if __cplusplus < 201103L 
#error This code requires C++11 
#endif 

C++ 11 16,8 Prede fi ned tên macro:

vĩ mô sau tên sẽ được xác định bởi việc triển khai:

__cplusplus

Tên __cplusplus được xác định giá trị 201103L khi biên dịch đơn vị dịch C++. (155)

(155) Dự định các phiên bản tương lai của tiêu chuẩn này sẽ thay thế giá trị của macro này với giá trị lớn hơn. Các trình biên dịch không phù hợp nên sử dụng giá trị có nhiều chữ số thập phân nhất.

+0

Tôi có nên sử dụng thứ gì đó như #if _cplusplus == 201103L {my code} #elif {display error} không? –

+0

@NehaKaranjkar: Đừng so sánh về sự bình đẳng. Tôi đã cập nhật câu trả lời với một ví dụ. – NPE

+0

Tôi vừa học về chỉ thị #error. Cảm ơn. +1 cho cả hai câu trả lời đề cập đến điều này. –

9

__cplusplus vĩ mô có thể đến tiện dụng

#if __cplusplus < 201103L 
#error C++11 Required 
#endif 
.210

Something như thế này

+2

Cấu trúc ví dụ hoạt động, nhưng tôi muốn kiểm tra ít hơn giá trị C++ 11. – chris

+0

-1 đây không phải là bằng chứng trong tương lai, nếu C++ 14/17 đi cùng thì sao? – TemplateRex

+0

@rhalbersma: Tôi đồng ý với tính kỹ thuật của sự quan sát của bạn mặc dù tôi thực sự không nghĩ rằng một phê chuẩn khác đang diễn ra bất kỳ lúc nào. C++ 03 ---> C++ 11, 8 năm ha .. –

5

Như đã nói, giải pháp chính xác là kiểm tra macro __cplusplus. Tuy nhiên, một số trình biên dịch có hỗ trợ một phần cho các tính năng C++ 11 nhưng không đặt macro này cho giá trị chính xác. Ví dụ, liệt kê mạnh mẽ có sẵn trong g + + kể từ GCC 4.4.0. Tuy nhiên, với tùy chọn -std=c++11 (và tương đương), macro __cplusplus không được đặt thành giá trị tốt trước GCC 4.7.0 (được đặt thành 1 thay thế). Điều đó có nghĩa rằng một số trình biên dịch có thể biên dịch mã của bạn nhưng sẽ không nếu bạn kiểm tra C++ 11 theo cách đó.

Nếu bạn chỉ cần các tính năng cụ thể, thì tôi sẽ kiểm tra chúng với Boost.Config xác định a whole set of macros có thể được sử dụng để kiểm tra trình biên dịch của bạn hỗ trợ các tính năng được yêu cầu. Trong trường hợp của bạn, bạn sẽ cần:

  • BOOST_NO_CXX11_SCOPED_ENUMS để liệt kê mạnh mẽ.
  • BOOST_NO_CXX11_SMART_PTR cho std::shared_ptr.
Các vấn đề liên quan