जी ++ के साथ सी ++ 11 का संकलन


367

मैं अपने C ++ कंपाइलर को C ++ 11 में अपडेट करने की कोशिश कर रहा हूं। मैंने थोड़ी खोज की है और मैं इस निष्कर्ष पर पहुंचा हूं कि मुझे ध्वज का उपयोग करना है -std=c++0xया -std=gnu++0x, लेकिन मुझे झंडे के बारे में बहुत सी बातें नहीं पता हैं। क्या कोई मेरी मदद कर सकता है? (मैं Ubuntu 12.04 का उपयोग कर रहा हूं।)

यहाँ वह त्रुटि है जो मुझे संकलक से तब मिलती है जब मैं एक पुस्तकालय का उपयोग करने का प्रयास करता हूं जो C ++ 11 (अर्थात सरणी) में शामिल है:

#include <array>
#include <iostream>

int main()
{
    std::array<int, 3> arr = {2, 3, 5};
    ...
}

इस फ़ाइल को आगामी ISO C ++ मानक, C ++ 0x के लिए कंपाइलर और लाइब्रेरी समर्थन की आवश्यकता है। यह समर्थन वर्तमान में प्रायोगिक है, और -std = c ++ 0x या -std = gnu ++ 0x बॉयलर विकल्प के साथ सक्षम होना चाहिए।


5
नवीनतम संस्करण में, आपको संभवतः -std=c++11इसके बजाय उपयोग करना होगा। शायद दोनों की अनुमति है, हालांकि।

6
इस संदर्भ में बहुत याद आती है। आपने जो पूरी कोशिश की है उसे दिखाएँ (शायद नमूना कोड जिसे आपने संकलन करने की कोशिश की थी), और वास्तव में क्या विफल रहा।
किलियांडीएस 12

4
@classdaknok_t: दोनों को अनुमति दी जानी चाहिए, साथ ही 12.04 जहाज g++-4.6डिफ़ॉल्ट रूप से (जो केवल समर्थन करता है -std=c++0x)
किलियांदेस 12

3
बाद में झंडे जोड़ें g++, उदा g++ -std=c++0x _filename_ && ./a.out
एन। 'सर्वनाम' मी।

1
इस पोस्ट के पार आया, शीर्षक त्रुटि संदेश के लिए खोज। Im एक QMAKE परियोजना पर काम कर रहा है, मेरे लिए समाधान CONFIG + = c ++ 11 से .pro फ़ाइल जोड़ रहा था।

जवाबों:


529

झंडे (या संकलक विकल्प) कुछ भी नहीं हैं लेकिन साधारण कमांड लाइन तर्क संकलक के लिए पारित किए गए हैं।

मान लें कि आप कमांड लाइन (टर्मिनल) से g ++ को आमंत्रित कर रहे हैं:

$ g++ -std=c++11 your_file.cpp -o your_program

या

$ g++ -std=c++0x your_file.cpp -o your_program

अगर ऊपर काम नहीं करता है।


8
-Wall -gबस के बाद डाल करने के लिए मत भूलनाg++
तुलसी Starynkevitch

7
@BasileStarynkevitch: मैं यह -Werrorभी जोड़ूंगा , कोई कारण नहीं जब कोई परियोजना शुरू कर रहा हो।
मथिउ एम।

3
बेहतर C ++ 11 समर्थन बहस योग्य है और बेहतर डायग्नोस्टिक्स इन दिनों इतने बेहतर नहीं दिखते हैं (क्लैंग का पेज उनका वर्णन करता है जो जीसीसी 4.2 का उपयोग करता है जो प्राचीन है) gcc.gnu.org/wiki/ClangDiagnosticsComparison ;)
जोनाथन

58
क्या कोई जानता है कि क्या / जब C ++ कंपाइलर डिफ़ॉल्ट रूप से C ++ 11 मानक का समर्थन करेगा, वह भी बिना ध्वज के?
डेनिस

2
और यदि आप पहले से ही नहीं जानते हैं, तो दृश्य C ++ में बस VC11 (विजुअल स्टूडियो 2012) या इसके बाद के संस्करण C ++ 11 के फीचर्स का उपयोग करें
2

44

आप अपने g++आदेश द्वारा जाँच कर सकते हैं :

which g++
g++ --version

यह आपको बताएगा कि वर्तमान में यह किस ओर इशारा कर रहा है।

g++4.7 पर स्विच करने के लिए (यह मानते हुए कि आपने इसे अपनी मशीन में स्थापित किया है), चलाएं:

sudo update-alternatives --config gcc

There are 2 choices for the alternative gcc (providing /usr/bin/gcc).

  Selection    Path              Priority   Status
------------------------------------------------------------
  0            /usr/bin/gcc-4.6   60        auto mode
  1            /usr/bin/gcc-4.6   60        manual mode
* 2            /usr/bin/gcc-4.7   40        manual mode

फिर चयन के 2रूप में चयन करें (मेरी मशीन पहले से ही g++4.7 की ओर इशारा करती है , इसलिए *)

एक बार जब आप कंप्लीट स्विच कर देते हैं तो फिर g++ --versionसे जाँच करें कि स्विचिंग सही ढंग से हुई है।

अब अपने प्रोग्राम को संकलित करें

g++ -std=c++11 your_file.cpp -o main

उल्लेखनीय है कि जी ++ 4.4 जैसे संस्करण कुछ सुविधाओं को करने के लिए बस पुराने हो सकते हैं, इसलिए अपग्रेड करना आवश्यक है। अपग्रेड करना आपके सिस्टम पर निर्भर करेगा, और मैं g ++ को खुद कंपाइल करने के तरीके और संदर्भ के लिए सिस्टम के कंपाइलर को बदलने से
कॉलिन डी

13

आपका ubuntu निश्चित रूप से g ++ का हालिया संस्करण है। उपयोग करने के लिए झंडा है -std=c++0x


आप यह कैसे कह सकते हैं, वह उबंटु का उपयोग कर रहा है? बस जानने को उत्सुक है।
श्रवण ४०

22
@ श्रवण 40 ओपी I'm using Ubuntu 12.04.प्रश्न में स्पष्ट रूप से कहते हैं ।
टिमोथी गु

10

यदि आप GNU कंपाइलर एक्सटेंशन रखना चाहते हैं, तो -std = gnu ++ 0x के बजाय -dd = c ++ 0x का उपयोग करें। यहाँ आदमी पृष्ठ से एक उद्धरण है:

कंपाइलर कई आधार मानकों को स्वीकार कर सकता है, जैसे कि c89 या c ++ 98, और GNU की उन मानकों की बोलियाँ, जैसे कि gnu89 या gnu ++ 98। आधार मानक निर्दिष्ट करके, कंपाइलर उस मानक का पालन करने वाले सभी कार्यक्रमों को स्वीकार करेगा और GNU एक्सटेंशन का उपयोग करने वाले जो इसका विरोधाभास नहीं करते हैं। उदाहरण के लिए, -std = c89 GCC की कुछ विशेषताओं को बंद कर देता है जो ISO C90 के साथ असंगत हैं, जैसे "asm" और "typeof" कीवर्ड, लेकिन अन्य GNU एक्सटेंशन नहीं हैं जिनका ISO C90 में कोई अर्थ नहीं है, जैसे कि छूटना "?:" अभिव्यक्ति का मध्य शब्द। दूसरी ओर, एक मानक की जीएनयू बोली को निर्दिष्ट करके, सभी सुविधाओं को संकलक समर्थन सक्षम किया जाता है, तब भी जब वे सुविधाएँ आधार मानक का अर्थ बदल देती हैं और कुछ सख्त-अनुरूप कार्यक्रमों को अस्वीकार किया जा सकता है। विशेष मानक का उपयोग करके पहचान की जाती है कि मानक के उस संस्करण को देखते हुए GNU एक्सटेंशन कौन सी सुविधाएँ हैं। उदाहरण के लिए- std = gnu89 -pedantic C ++ शैली // टिप्पणियों के बारे में चेतावनी देगा, जबकि -std = gnu99-upantic नहीं।


और बाइनरी ?:ऑपरेटर से हटकर आपको क्या मिलता है ? केवल अन्य विस्तार जो मन में आता है, संरचना अभिव्यक्तियाँ, C ++ 11 सूची आरंभीकरण द्वारा सुपररेटेड है। किसी भी स्थिति में, यह उद्धरण मुख्य रूप से C से संबंधित है, C ++ से नहीं।
पोटाटोस्वाटर

9

आप निम्नलिखित लिंक का उल्लेख कर सकते हैं जिसके लिए संकलक के विशेष संस्करण में विशेषताएं समर्थित हैं। यह संकलक में सुविधा समर्थन की एक विस्तृत सूची है। लगता है कि जीसीसी किसी भी अन्य कंपाइलर से पहले मानक को बारीकी से लागू करता है।

अपने प्रश्न के संबंध में आप उपयोग कर सकते हैं

  1. g++ -std=c++11 C ++ 11 के लिए
  2. g++ -std=c++14 C ++ 14 के लिए
  3. g++ -std=c++17 C ++ 17 के लिए
  4. g++ -std=c++2aC ++ 20 के लिए, हालांकि C ++ 20 की सभी विशेषताएं अभी तक समर्थित नहीं हैं , GCC में फ़ीचर सपोर्ट लिस्ट के लिए इस लिंक को देखें ।

सूची बहुत तेजी से बदलती है, सूची पर नज़र रखें, यदि आप किसी विशेष सुविधा के समर्थन की प्रतीक्षा कर रहे हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.