Compilazione di C ++ 11 con g ++


367

Sto cercando di aggiornare il mio compilatore C ++ a C ++ 11. Ho cercato un po 'e sono giunto alla conclusione che devo usare la bandiera -std=c++0xo -std=gnu++0x, ma non conosco molte cose sulle bandiere. Qualcuno può aiutarmi? (Sto usando Ubuntu 12.04.)

Ecco l'errore che ottengo dal compilatore quando tento di utilizzare una libreria inclusa in C ++ 11 (ovvero array):

#include <array>
#include <iostream>

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

Questo file richiede il supporto del compilatore e della libreria per l'imminente 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.


5
Nella versione più recente, probabilmente è necessario utilizzare -std=c++11invece. Forse entrambi sono ammessi, però.

6
Questo manca molto contesto. Mostra il comando completo che hai provato (forse anche il codice di esempio che hai provato a compilare) e ciò che è effettivamente fallito.
KillianDS,

4
@classdaknok_t: entrambi dovrebbero essere consentiti, anche Ubuntu 12.04 viene fornito g++-4.6di default (che supporta solo -std=c++0x)
KillianDS

3
Aggiungi bandiere subito dopo g++, ad es g++ -std=c++0x _filename_ && ./a.out.
n. 'pronomi' m.

1
Sono arrivato attraverso questo post, cercando un messaggio di errore intitolato. Sto lavorando a un progetto QMAKE, la soluzione per me è stata l'aggiunta di CONFIG + = c ++ 11 al file .pro.

Risposte:


529

I flag (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.


8
Non dimenticare di mettere -Wall -gsubito dopog++
Basile Starynkevitch,

7
@BasileStarynkevitch: aggiungerei -Werroranch'io, nessun motivo per non iniziare un progetto.
Matthieu M.,

3
Un supporto C ++ 11 migliore è discutibile e una diagnostica migliore non sembra molto migliore al giorno d'oggi (la pagina di Clang che li descrive usa GCC 4.2 che è antico) gcc.gnu.org/wiki/ClangDiagnosticsComparison ;)
Jonathan Wakely

58
Qualcuno sa se / quando i compilatori C ++ supporteranno lo standard C ++ 11 per impostazione predefinita, ovvero senza un flag?
Dennis,

2
E nel caso in cui non lo sapessi già, in Visual C ++ usa semplicemente VC11 (Visual Studio 2012) o versioni successive per avere funzionalità C ++ 11
gerrytan

44

Puoi controllare il tuo g++comando:

which g++
g++ --version

questo ti dirà quale complier è attualmente puntato.

Per passare a g++4.7 (presupponendo che sia stato installato sul computer), eseguire:

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 2come selezione (La mia macchina punta già a g++4.7, quindi il *)

Dopo aver cambiato il compilatore, quindi eseguire nuovamente g++ --versionper verificare che la commutazione sia avvenuta correttamente.

Ora compila il tuo programma con

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

Vale la pena ricordare che versioni come g ++ 4.4 potrebbero essere semplicemente troppo vecchie per fare alcune funzionalità, quindi è necessario l'aggiornamento. L'aggiornamento dipenderà dal tuo sistema e eviterei i metodi di compilazione di g ++ e di sostituzione del compilatore del sistema come riferimento
Colin D

13

Ubuntu ha sicuramente una versione sufficientemente recente di g ++. La bandiera da usare è -std=c++0x.


Come puoi dirlo, sta usando Ubuntu? Solo curioso di sapere.
Shravan40,

22
@ Shravan40 OP dice esplicitamente I'm using Ubuntu 12.04.nella domanda.
Timothy Gu,

10

Se vuoi mantenere le estensioni del compilatore GNU, usa -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 dialetti GNU di tali 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 contraddicono. Ad esempio, -std = c89 disattiva 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 omettere il termine medio di un'espressione "?:". D'altra parte, specificando un dialetto GNU di uno standard, tutte le funzionalità supportate dal compilatore sono abilitate, anche quando tali funzionalità cambiano il significato dello standard di base e alcuni programmi conformi rigorosamente potrebbero essere respinti. Lo standard particolare viene utilizzato da -pedantic per identificare quali funzionalità sono estensioni GNU data quella versione dello standard. Ad esempio-std = gnu89 -pedantic avviserebbe dello stile C ++ // commenti, mentre -std = gnu99 -pedantic no.


E cosa ti prende, a parte l' ?:operatore binario ? L'unica altra estensione che viene in mente, le espressioni di struttura, è sostituita dall'inizializzazione dell'elenco C ++ 11. In ogni caso, questa citazione si riferisce principalmente a C, non a C ++.
Potatoswatter,

9

È possibile fare riferimento al seguente collegamento per le quali sono supportate le funzionalità in una particolare versione del compilatore. Ha un elenco completo del supporto delle funzionalità nel compilatore. Sembra che GCC segua da vicino lo standard e implementa prima di qualsiasi 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++2aper C ++ 20, sebbene tutte le funzionalità di C ++ 20 non siano ancora supportate, fare riferimento a questo collegamento per l'elenco delle funzionalità supportate in GCC.

L'elenco cambia abbastanza velocemente, tieni d'occhio l'elenco, se stai aspettando che una particolare funzione sia supportata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.