อะไรคือความแตกต่างระหว่าง -std = c ++ 11 และ -std = gnu ++ 11?


132

อะไรคือความแตกต่างระหว่าง-std=c++11และ-std=gnu++11เป็นพารามิเตอร์การคอมไพล์สำหรับ gcc และ clang? คำถามเดียวกันกับc99และgnu99? ฉันรู้เกี่ยวกับมาตรฐาน C ++ และ C มันคือความแตกต่างของพารามิเตอร์ที่ฉันสนใจ

ฉันได้อ่านบางแห่งที่เกี่ยวข้องกับส่วนขยายบางอย่าง แต่ไม่ชัดเจนสำหรับฉันว่าส่วนขยายใดและจะเลือกระหว่างอันใดอันหนึ่งสำหรับโปรเจ็กต์ใหม่


5
สิ่งgnuเหล่านี้อ้างถึงส่วนขยายและหากคุณต้องการเขียนโค้ดแบบพกพาคุณควรยึดติดกับมาตรฐานและหลีกเลี่ยงส่วนขยายทั้งหมด
juanchopanza

คำตอบ:


91

ดังที่คุณได้ค้นพบความแตกต่างระหว่างสองตัวเลือกคือเปิดใช้งานส่วนขยาย GNU ที่ละเมิด / ขยายมาตรฐาน C ++ หรือไม่ ลิขสิทธิ์ GNU C ++ ส่วนขยายจะมีคำอธิบายที่นี่ คุณยังสามารถใช้ส่วนขยาย GNU C ส่วนใหญ่ (อธิบายไว้ที่นี่ ) ในโปรแกรม C ++ ของคุณ การอ่านเกี่ยวกับ-Wpedanticตัวเลือก GCC ที่นี่จะเป็นประโยชน์เช่นกัน

โปรดทราบว่าส่วนขยายบางรายการยังคงมีผลบังคับใช้เมื่อใช้-std=c++11งานได้ตราบใดที่ไม่ขัดแย้งกับมาตรฐาน ตัวอย่างเช่นเมื่อใช้คอมไพเลอร์ MinGW ฉันต้องการส่วนขยายสำหรับไฟล์Boost.Lexical_Cast. แต่ตราบใดที่คุณไม่ได้ใช้สิ่งเหล่านี้คุณควรยึดติดกับมาตรฐานโดยไม่มีส่วนขยายเพื่อความสะดวกในการพกพาสูงสุด สิ่งนี้อาจมีประโยชน์หากคุณพบว่าตัวเองถูกบังคับให้เปลี่ยนคอมไพเลอร์


4
ใช่ฉันหลีกเลี่ยงส่วนขยายเพราะฉันไม่แนะนำให้ทำอะไรที่ไม่ได้กำหนดโดยมาตรฐานโดยเฉพาะ ... แต่ถึงอย่างนั้นคำว่า "ละเมิด" ก็เป็นคำที่แปลกและมีการโหลดเมื่อมีส่วนขยายเหล่านี้จำนวนมากเพื่อใช้ Standardese เพียงแค่กำหนดการนำไปใช้งานหรือระบุสิ่งต่างๆที่ Standard เปิดอยู่หรืออาจเป็นส่วนขยายทั้งหมดก็ได้ ... คุณมีข้อมูลอ้างอิงสำหรับส่วนขยาย GNU ที่ละเมิดมาตรฐานโดยทำสิ่งที่แตกต่างจากสิ่งที่ Standard กำหนดไว้อย่างชัดเจนหรือไม่
underscore_d

9
แม้ว่าคำตอบนี้จะเป็นคำตอบทั่วไปที่ดี แต่คุณจะพิจารณาแก้ไขเพื่อให้อย่างน้อยแสดงรายการส่วนขยายที่เปิดใช้งานgnu11แต่ไม่ได้อยู่ในc++11? รายการที่คุณเชื่อมโยงเป็นของส่วนขยายทั้งหมดและตามที่คุณระบุว่ามีการเปิดใช้งานบางรายการด้วยc++11เช่นกัน (เช่น__restrict__)
einpoklum

สิ่งที่ฉันค้นพบในตอนนี้และจะไม่มีวันสรุปได้โดยดูเอกสารประกอบของแฟล็กมีดังต่อไปนี้: -std = c ++ 11 เปิดใช้งานทริกเกอร์อีกครั้ง -std = gnu ++ 11 ละเว้นและส่งเสียงเตือนเช่นนี้ ทำเมื่อละเว้น -std alltogether
Daniel82
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.