Compilare C ++ 11 con g ++

Sto cercando di aggiornare il mio compilatore C ++ in C ++ 11. Ho cercato un po ‘e sono giunto alla conclusione che devo usare flag -std=c++0x o -std=gnu++0x , ma non conosco molte cose sui flag. Qualcuno può aiutarmi? (Sto usando Ubuntu 12.04.)

Ecco l’errore che ottengo dal compilatore quando tento di usare una libreria che è inclusa in C ++ 11 (cioè array):

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

Questo file richiede il supporto di compilatori e librerie per il prossimo standard ISO C ++, C ++ 0x. Questo supporto è attualmente sperimentale e deve essere abilitato con le opzioni del compilatore -std = c ++ 0x o -std = gnu ++ 0x.

Le bandiere (o le opzioni del compilatore) non sono altro che normali argomenti della riga di comando passati all’eseguibile del compilatore.

Supponendo che tu stia invocando g ++ dalla riga di comando (terminale):

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

o

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

se quanto sopra non funziona.

Puoi controllare il tuo g++ tramite comando:

 which g++ g++ --version 

questo ti dirà quale complier sta attualmente indicando.

Per passare a g++ 4.7 (presumendo che tu l’abbia installato nel tuo computer), esegui:

 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 

Quindi seleziona 2 come selezione (La mia macchina sta già puntando su g++ 4.7, quindi *)

Una volta triggersto il compilatore, eseguire nuovamente g++ --version per verificare che il passaggio sia avvenuto correttamente.

Ora compila il tuo programma con

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

La tua ubuntu ha sicuramente una versione abbastanza recente di g ++. Il flag da utilizzare è -std=c++0x .

Se si desidera mantenere le estensioni del compilatore GNU, utilizzare -std = gnu ++ 0x anziché -std = c ++ 0x. Ecco una citazione dalla pagina man:

Il compilatore può accettare diversi standard di base, come c89 o c ++ 98, e i dialetti GNU di quegli standard, come gnu89 o gnu ++ 98. Specificando uno standard di base, il compilatore accetterà tutti i programmi che seguono quello standard e quelli che usano estensioni GNU che non lo contraddicano. Ad esempio, -std = c89 distriggers alcune funzionalità di GCC che sono incompatibili con ISO C90, come le parole chiave “asm” e “typeof”, ma non altre estensioni GNU che non hanno un significato in ISO C90, come ad esempio omettere il termine medio di un’espressione “?:”. D’altra parte, specificando un dialetto GNU di uno standard, tutte le funzionalità del supporto del compilatore sono abilitate, anche quando quelle funzioni cambiano il significato dello standard di base e alcuni programmi rigorosi possono essere rifiutati. Il particolare standard è usato da -pedantic per identificare quali funzionalità sono estensioni GNU date quella versione dello standard. Ad esempio-std = gnu89 -pedantic avviserà sui commenti // in stile C ++, mentre -std = gnu99 -pedantic non lo farebbe.

È ansible fare riferimento al seguente link per le funzionalità supportate in una particolare versione del compilatore. Ha un elenco completo di funzionalità supportate nel compilatore. Sembra che GCC segua lo standard da vicino e implementa prima di ogni altro compilatore.

Per quanto riguarda la tua domanda puoi compilare usando

  1. g++ -std=c++11 per C ++ 11
  2. g++ -std=c++14 per C ++ 14
  3. g++ -std=c++17 per C ++ 17
  4. g++ -std=c++2a per C ++ 20, sebbene tutte le funzionalità di C ++ 20 non siano ancora supportate, fare riferimento a questo link per l’elenco di supporto delle funzionalità in GCC.

La lista cambia abbastanza velocemente, tieni d’occhio la lista, se aspetti che funzioni particolari siano supportate.