Từ Câu hỏi thường gặp về Bjarne Stroustrup C ++ 0x :
__cplusplus
Trong C ++ 0x, macro __cplusplussẽ đượ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:
__cpluspluslà 1.
- C ++ 98:
__cpluspluslà 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:
__cpluspluslà 201103L.
- C ++ 14:
__cpluspluslà 201402L.
- C ++ 17:
__cpluspluslà 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 - autoconflà công cụ được lựa chọn nếu sử dụng tuyến đường này).