ใน GCC, Clang และ MSVC มีวิธีใดที่จะสอดคล้องกับ C ++ 98 และไม่ใช่ C ++ 03 หรือไม่

คำถามเมตา เสนอว่า c++98 และ c++03 ควรทำคำพ้องความหมาย ผู้ถามคำถามติดตามด้วย การกำหนดค่าเริ่มต้นเป็นส่วนหนึ่งของมาตรฐาน C++98 หรือไม่ ถ้าไม่ เหตุใดจึงถูกเพิ่มเข้าไปในมาตรฐาน C++03 เป็นคำถามที่ดีเยี่ยมซึ่งทำให้กระจ่างเกี่ยวกับการเพิ่ม การกำหนดค่าเริ่มต้น ให้กับ C++03 พิจารณาคำถามนี้เพื่อติดตามผลในข้อหลัง

OP ยืนยันว่าคอมไพเลอร์สมัยใหม่ไม่ต้องแยกแยะความแตกต่างระหว่าง C++98 และ C++03 สิ่งนี้ทำให้ฉันประหลาดใจ เนื่องจากกลายเป็นกรณีของคอมไพเลอร์สมัยใหม่สามคน แม้ว่าคำถามนี้อาจเดือดถึง "RTFM" แต่การค้นหาของฉันไม่พบข้อสรุปใด ๆ

จีซีซี

หน้ามาตรฐาน:

มาตรฐาน ISO C++ ดั้งเดิมได้รับการเผยแพร่เป็นมาตรฐาน ISO (ISO/IEC 14882:1998) และแก้ไขเพิ่มเติมโดย Technical Corrigenda ที่เผยแพร่ในปี 2003 (ISO/IEC 14882:2003) มาตรฐานเหล่านี้เรียกว่า C++98 และ C++03 ตามลำดับ GCC ใช้ C++98 ส่วนใหญ่ (การส่งออกเป็นข้อยกเว้นที่น่าสังเกต) และการเปลี่ยนแปลงส่วนใหญ่ใน C++03 หากต้องการเลือกมาตรฐานนี้ใน GCC ให้ใช้หนึ่งในตัวเลือก -ansi, -std=c++98 หรือ -std=c++03; ...

นอกจากนี้ ตัวเลือกภาษาถิ่น หน้า พูดว่า:

ในโหมด C++ [ansi] เทียบเท่ากับ -std=c++98

และจัดกลุ่ม "c++98" และ "c++03" เข้าด้วยกัน:

มาตรฐาน ISO C++ ปี 1998 บวกกับ Corrigendum ทางเทคนิคปี 2003 และรายงานข้อบกพร่องเพิ่มเติมบางส่วน เช่นเดียวกับ -ansi สำหรับโค้ด C++

ดูเหมือนว่าจะบอกเป็นนัยว่าไม่มีวิธีเปิดโหมด เท่านั้น C++98

เสียงดังกราว

สิ่งเดียวที่ฉันพบสำหรับ Clang อยู่ที่คู่มือ โดยระบุไว้ใน คุณลักษณะภาษา C++:

เสียงดังกราวใช้มาตรฐาน C ++ 98 ทั้งหมดอย่างสมบูรณ์ ยกเว้นเทมเพลตที่ส่งออก (ซึ่งถูกลบใน C ++ 11) ...

โดยไม่มีการกล่าวถึง C++03 นอกจากนี้ยังระบุด้วยว่า:

เสียงดังกราวรองรับตัวเลือก -std ซึ่งเปลี่ยนสิ่งที่โหมดภาษาเสียงดังกราวใช้ โหมดที่รองรับสำหรับ C ได้แก่ c89, gnu89, c94, c99, gnu99, c11, gnu11 และนามแฝงต่างๆ สำหรับโหมดเหล่านั้น หากไม่มีการระบุตัวเลือก -std เสียงดังกราวจะใช้ค่าเริ่มต้นเป็นโหมด gnu11 คุณลักษณะ C99 และ C11 หลายอย่างได้รับการสนับสนุนในโหมดก่อนหน้านี้เป็นส่วนขยายที่สอดคล้อง โดยมีคำเตือน

นี่เป็นหลักสูตรสำหรับคอมไพเลอร์ C ของพวกเขา ฉันไม่พบเอกสารใดๆ เกี่ยวกับคอมไพเลอร์ C++ เช่น ตัวเลือกใดที่สามารถส่งผ่านไปยัง -std ได้ ฉันแค่สันนิษฐานว่า Clang สะท้อนตัวเลือกภาษาถิ่นของ GCC (เช่น C ++ 03 ใช้ได้กับ Clang) แม้ว่าหากไม่มีข้อพิสูจน์ฉันก็ไม่สามารถสรุปได้อย่างแน่ชัด

เอ็มเอสวีซี

เท่าที่ฉันรู้ MSVC ไม่อนุญาตให้คุณเปลี่ยนมาตรฐานภาษาเหมือนที่ทั้งสองข้างบนทำ การค้นหา "C++98" บน MSDN ไม่แสดงผลอะไรเลย ดูเหมือนว่าพวกเขาจะใช้ C++98/C++11 เช่นตามที่ระบุไว้โดย สมุนไพรซัตเตอร์

คำถาม

แม้ว่าคำถามเหล่านี้จะฟังดูชัดเจน แต่คำถามเมตาทำให้ฉันรู้ว่า ไม่ ไม่ชัดเจนนัก

  • มีวิธีทำให้ GCC สอดคล้องกับ C ++ 98 เท่านั้นหรือไม่ การบังคับใช้มาตรฐาน C++98 ใน gcc เพียงลิงก์ไปยังเอกสารฉบับเดียวกัน I ทำโดยไม่ต้องพิจารณาเพิ่มเติมว่าสอดคล้องกับ C ++ 98 จริง ๆ หรือไม่

  • เสียงดังกราวเป็นไปตาม C ++ 98 หรือจริง ๆ แล้วสอดคล้องกับ C ++ 03 หรือไม่ ฉันจะหาเอกสารที่เกี่ยวข้องกับเรื่องนี้ได้ที่ไหน

  • เช่นเดียวกับ MSVC มีวิธีเปลี่ยนมาตรฐานภาษาใน MSVC ให้สอดคล้องกับ C ++ 98 เท่านั้นหรือไม่


person Community    schedule 08.12.2014    source แหล่งที่มา
comment
การเพิ่ม -std=c++98 จะไม่มีประโยชน์เลยสำหรับโค้ดจริง มีเพียงคนโง่และผู้ที่เขียนชุดการตรวจสอบคอมไพเลอร์เท่านั้นที่จะใช้ C++03 แก้ไขข้อบกพร่องที่สำคัญมากมายใน C++98 มันจะทำให้ชีวิตของผู้เขียนคอมไพเลอร์ยากขึ้น เนื่องจากจะเพิ่มจำนวนการกำหนดค่าและโหมดที่ต้องทดสอบ อาจทำให้เกิดข้อบกพร่อง และโดยทั่วไปจะสร้างปัญหาให้กับผู้พัฒนาและผู้ใช้คอมไพเลอร์ ซึ่งไม่มีใครสนใจหรือใช้ -std=c++98 ตัวเลือก   -  person Jonathan Wakely    schedule 08.12.2014
comment
ฉันกำลังคิดจะถามสิ่งนี้เหมือนกัน!   -  person Praxeolitic    schedule 08.12.2014


คำตอบ (1)


มีวิธีทำให้ GCC สอดคล้องกับ C ++ 98 เท่านั้นหรือไม่

ไม่ คุณได้ครอบคลุมการตั้งค่าสถานะที่มีอยู่ในคำถามของคุณอย่างละเอียดแล้ว และไม่มีรายการใดที่สามารถทำได้


เสียงดังกราวเป็นไปตาม C ++ 98 หรือจริง ๆ แล้วสอดคล้องกับ C ++ 03 หรือไม่ ฉันจะหาเอกสารที่เกี่ยวข้องกับเรื่องนี้ได้ที่ไหน

เสียงดังกราวใช้ C++03 ลบ export เช่นเดียวกับ GCC:

Clang ใช้มาตรฐาน ISO C++ 1998 ทั้งหมด (รวมถึงข้อบกพร่องที่ระบุในมาตรฐาน ISO C++ 2003) ยกเว้นการส่งออก (ซึ่งถูกลบออกใน C++ 11)


เช่นเดียวกับ MSVC มีวิธีเปลี่ยนมาตรฐานภาษาใน MSVC ให้สอดคล้องกับ C ++ 98 เท่านั้นหรือไม่

ไม่ อย่างที่คุณพูด คุณไม่สามารถระบุเวอร์ชัน C++ ใน MSVC ได้ มีรายการแฟล็กคอมไพเลอร์และนั่นไม่ใช่หน้าที่ของแฟล็กใดๆ


จุดประสงค์ทั้งหมดของ C++03 คือการแก้ไข C++98 และแทนที่มันอย่างมีประสิทธิภาพทันที แทนที่จะติดตามเป็นหน่วยใหม่ มันไม่สมเหตุสมผลเลยที่ต้องการ "เปลี่ยนกลับ" การแก้ไขเหล่านั้น นั่นก็เหมือนกับการขอให้ Windows 7 SP2 บูตเข้าสู่โหมด Windows 7 SP1 ไม่ใช่รุ่นที่ใครๆ ก็อยากสนับสนุน

ตัวละคร

person Lightness Races in Orbit    schedule 08.12.2014