2012-05-16 17 views
98

जीसीसी और क्लैंग के लिए संकलन पैरामीटर के रूप में -std=c++11 और -std=gnu++11 के बीच अंतर क्या हैं? c99 और gnu99 के साथ वही प्रश्न? मुझे सी ++ और सी मानकों के बारे में पता है, यह उन मापदंडों में अंतर है जो मुझे रूचि देते हैं।-std = C++ 11 और -std = gnu ++ 11 के बीच अंतर क्या हैं?

मैंने कहीं पढ़ा है कि इसे कुछ एक्सटेंशन के साथ करना है, लेकिन यह मुझे स्पष्ट नहीं है कि एक और एक नई परियोजना के लिए एक या दूसरे के बीच कैसे चयन करें।

+5

'gnu' एक्सटेंशन एक्सटेंशन का संदर्भ लेते हैं, और यदि आप पोर्टेबल कोड लिखना चाहते हैं तो आपको मानक से चिपकना चाहिए और एक्सटेंशन को पूरी तरह से टालना चाहिए। – juanchopanza

उत्तर

66

जैसा कि आपने स्वयं को पाया है, दो विकल्पों के बीच का अंतर यह है कि क्या सीएन ++ मानक का उल्लंघन करने वाले जीएनयू एक्सटेंशन सक्षम हैं या नहीं। जीएनयू एक्सटेंशन का वर्णन here है। ध्यान दें कि -std=c++11 का उपयोग करते समय कुछ एक्सटेंशन अभी भी प्रभावी हो सकते हैं, जब तक कि वे मानक का विरोध नहीं करते हैं।

उदाहरण के लिए, मिनजीडब्ल्यू कंपाइलर का उपयोग करते समय, मुझे Boost.Lexical_Cast पर काम करने के लिए एक्सटेंशन की आवश्यकता है। लेकिन, जब तक आप उनमें से किसी का भी उपयोग नहीं करते हैं, तो आप अधिकतम पोर्टेबिलिटी के लिए एक्सटेंशन के बिना मानक पर चिपके रहना बेहतर कर सकते हैं। यदि आप खुद को कंपाइलर बदलने के लिए मजबूर पाते हैं तो यह आसान हो सकता है।

+4

कई मामलों में एक्सटेंशन मानक –

+2

हाँ का उल्लंघन नहीं करते हैं, मैं एक्सटेंशन से बचता हूं क्योंकि मैं ऐसा कुछ भी करने की अनुशंसा नहीं करता जो मानक द्वारा परिभाषित नहीं किया गया है ... लेकिन फिर भी, "उल्लंघन" एक अजीब और भरा हुआ है शब्द, जब इनमें से बहुत से एक्सटेंशन हैं, मानक का उपयोग करने के लिए, केवल _implementation-defining_ या _specifying_ चीजें जो मानक चुप है - या शायद सभी एक्सटेंशन ... क्या आपके पास किसी भी जीएनयू एक्सटेंशन का उद्धरण है जो उल्लंघन करता है मानक किसी चीज से कुछ अलग करके मानक स्पष्ट रूप से परिभाषित करता है? –

+4

हालांकि यह उत्तर एक अच्छा सामान्य है, क्या आप इसे संपादित करने पर विचार करेंगे ताकि कम से कम उन एक्सटेंशन को सूचीबद्ध किया जा सके जो 'gnu11' में सक्षम हैं लेकिन 'C++ 11' में नहीं हैं? आपके द्वारा लिंक की गई सूची सभी एक्सटेंशन का है, और जैसा कि आप स्वयं इंगित करते हैं कि उनमें से कुछ 'C++ 11' के साथ सक्षम हैं (जैसे '__restrict__')। – einpoklum

संबंधित मुद्दे