C++11 compileren met g++

Ik probeer mijn C++-compiler te updaten naar C++11.
Ik heb wat gezocht en ben tot de conclusie gekomen dat ik de vlag -std=c++0xof -std=gnu++0xmoet gebruiken, maar Ik weet niet veel van vlaggen. Kan iemand mij helpen? (Ik gebruik Ubuntu 12.04.)

Dit is de foutmelding die ik krijg van de compiler wanneer ik probeer een bibliotheek te gebruiken die is opgenomen in C++11 (d.w.z. array):

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

Dit bestand vereist compiler- en bibliotheekondersteuning voor de aankomende ISO C++-standaard, C++0x. Deze ondersteuning is momenteel experimenteel en moet worden ingeschakeld met de compileropties -std=c++0x of -std=gnu++0x.


Antwoord 1, autoriteit 100%

Vlaggen (of compileropties) zijn niets anders dan gewone opdrachtregelargumenten die aan het uitvoerbare bestand van de compiler worden doorgegeven.

Ervan uitgaande dat u g++ aanroept vanaf de opdrachtregel (terminal):

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

of

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

als het bovenstaande niet werkt.


Antwoord 2, autoriteit 8%

Je kunt je g++controleren met het commando:

which g++
g++ --version

dit zal je vertellen naar welke complier het momenteel wijst.

Als u wilt overschakelen naar g++4.7 (ervan uitgaande dat u het op uw computer hebt geïnstalleerd), voert u het volgende uit:

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

Selecteer vervolgens 2als selectie (Mijn machine wijst al naar g++4.7, dus de *)

Zodra u de complier omschakelt, voert u g++ --versionopnieuw uit om te controleren of de omschakeling correct is gebeurd.

Compileer nu uw programma met

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

Antwoord 3, autoriteit 3%

U kunt de volgende linkraadplegen waarvoor functies worden ondersteund in een bepaalde versie van de compiler . Het heeft een uitputtende lijst van functie-ondersteuning in de compiler. Ziet eruit dat GCC de standaard op de voet volgt en implementeert vóór elke andere compiler.

Wat betreft je vraag kun je compileren met

  1. g++ -std=c++11voor C++11
  2. g++ -std=c++14voor C++14
  3. g++ -std=c++17voor C++17
  4. g++ -std=c++2avoor C++20, hoewel alle functies van C++20 nog niet worden ondersteund, raadpleeg deze linkvoor de lijst met functieondersteuning in GCC.

De lijst verandert vrij snel, houd de lijst in de gaten als u wacht tot een bepaalde functie wordt ondersteund.


Antwoord 4, autoriteit 3%

Uw Ubuntu heeft zeker een voldoende recente versie van g++. De te gebruiken vlag is -std=c++0x.


Antwoord 5, autoriteit 2%

Als je de GNU-compilerextensies wilt behouden, gebruik dan -std=gnu++0x in plaats van -std=c++0x. Hier is een citaat van de man-pagina:

De compiler kan verschillende basisstandaarden accepteren, zoals c89 of c++98,
en GNU-dialecten van die standaarden, zoals gnu89 of gnu++98. Door
door een basisstandaard op te geven, accepteert de compiler alle programma’s
die die standaard volgen en degenen die GNU-extensies gebruiken die dat niet doen
het tegenspreken. Bijvoorbeeld, -std=c89 schakelt bepaalde functies van GCC uit
die niet compatibel zijn met ISO C90, zoals de “asm” en “typeof”
trefwoorden, maar geen andere GNU-extensies die geen betekenis hebben in
ISO C90, zoals het weglaten van de middelste term van een “?:”-expressie. Op de
aan de andere kant, door een GNU-dialect van een standaard op te geven, worden alle functies
de compiler-ondersteuning is ingeschakeld, zelfs als die functies de
betekenis van de basisstandaard en sommige strikt conforme programma’s kunnen
afgewezen worden. De specifieke standaard wordt gebruikt door -pedantic om te identificeren:
welke functies GNU-extensies zijn gezien die versie van de standaard.
Bijvoorbeeld-std=gnu89 -pedantic zou waarschuwen voor C++-stijl //
opmerkingen, terwijl -std=gnu99 -pedantic dat niet zou doen.

Other episodes