Từ Câu hỏi thường gặp về Bjarne Stroustrup C ++ 0x :
__cplusplus
Trong C ++ 0x, macro __cplusplus
sẽ được đặt thành một giá trị khác với (lớn hơn) hiện tại 199711L
.
Mặc dù điều này không hữu ích như người ta muốn. gcc
(dường như trong gần 10 năm) đã đặt giá trị này 1
, loại trừ một trình biên dịch chính, cho đến khi nó được sửa khi gcc 4.7.0 ra mắt .
Đây là các tiêu chuẩn C ++ và giá trị nào bạn có thể mong đợi __cplusplus
:
- C ++ trước C ++ 98:
__cplusplus
là 1
.
- C ++ 98:
__cplusplus
là 199711L
.
- C ++ 98 + TR1: Cái này đọc là C ++ 98 và không có cách nào để kiểm tra mà tôi biết.
- C ++ 11:
__cplusplus
là 201103L
.
- C ++ 14:
__cplusplus
là 201402L
.
- C ++ 17:
__cplusplus
là 201703L
.
Nếu trình biên dịch có thể cũ hơn gcc
, chúng tôi cần phải sử dụng đến hackery cụ thể của trình biên dịch (xem macro phiên bản, so sánh nó với một bảng có các tính năng được triển khai) hoặc sử dụng Boost.Config (cung cấp các macro có liên quan ). Ưu điểm của việc này là chúng tôi thực sự có thể chọn các tính năng cụ thể của tiêu chuẩn mới và viết giải pháp thay thế nếu tính năng bị thiếu. Điều này thường được ưu tiên hơn giải pháp bán buôn, vì một số trình biên dịch sẽ yêu cầu triển khai C ++ 11, nhưng chỉ cung cấp một tập hợp con các tính năng.
Wiki Stdcxx lưu trữ một ma trận toàn diện để hỗ trợ trình biên dịch các tính năng C ++ 0x (nếu bạn dám tự mình kiểm tra các tính năng).
Thật không may, việc kiểm tra các tính năng chi tiết hơn (ví dụ: các chức năng thư viện riêng lẻ như std::copy_if
) chỉ có thể được thực hiện trong hệ thống xây dựng của ứng dụng của bạn (chạy mã với tính năng, kiểm tra xem nó có được biên dịch và tạo ra kết quả chính xác không - autoconf
là công cụ được lựa chọn nếu sử dụng tuyến đường này).