2013-07-19 34 views
6

Có thể xác định xem thư viện chuẩn C++ có hỗ trợ C++ 11 bằng cách sử dụng chỉ thị tiền xử lý không?Có một chỉ thị tiền xử lý để phát hiện thư viện chuẩn C++ 11 không?

Tôi hiện đang làm việc trên một dự án sử dụng ngôn ngữ C++ 11, nhưng với thư viện chuẩn C++ không hỗ trợ C++ 11 (tôi cần điều này để có thể liên kết với không C++ 11 thư viện).

Tôi biết rằng tôi có thể kiểm tra hỗ trợ C++ 11 bằng cách sử dụng #if __cplusplus >= 201103L, nhưng trong trường hợp của tôi, điều này sẽ được đánh giá là đúng. Tôi cần biết về hỗ trợ thư viện chuẩn C++ cho C++ 11.

+1

Related: http://stackoverflow.com/q/11886288/743214 –

+1

* "Tôi biết rằng tôi có thể kiểm tra hỗ trợ C++ 11 bằng cách sử dụng' #if __cplusplus> = 201103L' "* - Không , thậm chí không. Do hầu hết các trình biên dịch chỉ hỗ trợ một tập hợp con của C++ 11 (tuy nhiên, tập con lớn có thể được, mặc dù), macro '__cplusplus' này là hoàn toàn vô dụng. Thử nghiệm một cách đáng kể cho các tính năng tiêu chuẩn (có thể là ngôn ngữ hoặc thư viện) vẫn là một vấn đề chưa được giải quyết (mặc dù * cố gắng * để giải quyết nó đang trên đường của họ, như * TemplateRex * chỉ ra trong câu trả lời của mình). –

+1

Với tôi, vấn đề của bạn có vẻ như bạn cần một công cụ cấu hình như CMake hoặc autotools. Họ thực hiện kiểm tra cho bạn và tạo tiêu đề chứa Macro mà bạn có thể đánh giá. Nếu bạn chỉ có một thư viện, bạn có thể yêu cầu từ người dùng của mình cung cấp macro - vẫn là giải pháp kém. – usr1234567

Trả lời

3

Kiểm tra tính năng là hướng nghiên cứu tích cực cho Ủy ban chuẩn hướng tới tiêu chuẩn C++ 14 tiếp theo (và hơn thế nữa). Có một nhóm nghiên cứu 10 với riêng mình có thể truy cập miễn phí mailinglist nơi phát triển hiện tại đang được thảo luận. Đối với cuộc họp tiếp theo, số N3694 working paper này đã được gửi.

3

Sự cố của tôi là trên nền tảng iOS nơi thư viện chuẩn C++ chọn là giữa libstd++ (GNU C++ standard library)libc++ (LLVM C++ standard library with C++11 support). Tôi đã sử dụng số _GLIBCXX_. Mã hoàn chỉnh đã kết thúc là:

#ifndef _GLIBCXX_ 
template <class T> 
T&& move (T& arg) noexcept { 
    return static_cast<T&&>(arg); 
} 
#endif 
+1

Tôi giả sử bạn có nghĩa là '__GLIBCXX__', và bạn có nghĩa là' ifdef' không 'ifndef'? Thử nghiệm của bạn giả định rằng libstdC++ không bao giờ có hỗ trợ C++ 11, nhưng điều đó không đúng, chỉ có phiên bản cũ đi kèm với máy Mac của bạn không có hỗ trợ C++ 11. –

+0

... một năm sau ... Tôi thực sự đã kết thúc bằng cách sử dụng định nghĩa tiền xử lý của riêng mình thay vì dựa vào kiểm tra tự động của thư viện chuẩn. – Mortennobel

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