จากคำถามที่พบบ่อย Bjarne Stroustrup C ++ 0x :
__cplusplus
ใน C ++ 0x แมโคร__cplusplus
จะถูกตั้งค่าที่แตกต่างจาก (มีค่ามากกว่า) 199711L
ในปัจจุบัน
แม้ว่าสิ่งนี้จะไม่เป็นประโยชน์อย่างที่ใคร ๆ ต้องการ gcc
(เห็นได้ชัดเกือบ 10 ปี) ได้ตั้งค่านี้เป็น1
คดีหนึ่งคอมไพเลอร์ที่สำคัญจนกระทั่งมันได้รับการแก้ไขเมื่อ GCC 4.7.0 ออกมา
นี่คือมาตรฐาน C ++ และคุณค่าที่คุณคาดหวังได้จาก__cplusplus
:
- C ++ pre-C ++ 98:
__cplusplus
คือ1
.
- C ++ 98:
__cplusplus
คือ199711L
.
- C ++ 98 + TR1: สิ่งนี้อ่านว่า C ++ 98 และไม่มีวิธีตรวจสอบว่าฉันรู้
- C ++ 11:
__cplusplus
คือ201103L
.
- C ++ 14:
__cplusplus
คือ201402L
.
- C ++ 17:
__cplusplus
คือ201703L
.
หากคอมไพเลอร์อาจเป็นรุ่นเก่าgcc
เราจำเป็นต้องใช้แฮ็กเกอร์เฉพาะของคอมไพเลอร์ (ดูที่มาโครเวอร์ชันเปรียบเทียบกับตารางที่มีคุณสมบัติที่ใช้งาน) หรือใช้Boost.Config (ซึ่งมีมาโครที่เกี่ยวข้อง ) ข้อดีของสิ่งนี้คือเราสามารถเลือกคุณลักษณะเฉพาะของมาตรฐานใหม่และเขียนวิธีแก้ปัญหาได้หากไม่มีคุณลักษณะดังกล่าว สิ่งนี้มักเป็นที่ต้องการมากกว่าโซลูชันการขายส่งเนื่องจากคอมไพเลอร์บางตัวจะอ้างว่าใช้ C ++ 11 แต่มีคุณลักษณะเพียงบางส่วนเท่านั้น
Stdcxx Wiki โฮสต์เมทริกซ์ที่ครอบคลุมสำหรับการสนับสนุนคอมไพเลอร์ของคุณสมบัติ C ++ 0x (ถ้าคุณกล้าที่จะตรวจสอบคุณสมบัติด้วยตัวเอง)
น่าเสียดายที่การตรวจสอบคุณสมบัติที่ละเอียดยิ่งขึ้น (เช่นฟังก์ชันไลบรารีแต่ละรายการเช่นstd::copy_if
) สามารถทำได้ในระบบบิลด์ของแอปพลิเคชันของคุณเท่านั้น (รันโค้ดด้วยคุณสมบัติตรวจสอบว่าคอมไพล์และให้ผลลัพธ์ที่ถูกต้องหรือไม่ - autoconf
เป็นเครื่องมือที่คุณเลือกได้หากใช้ เส้นทางนี้).