2012-04-28 3 views
258

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

Ecco l'errore che ottengo dal compilatore quando si tenta di utilizzare una libreria che è incluso in C++ 11 (cioè array):

#include <array> 
#include <iostream> 

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

This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.

+0

Dipende da quello che si utilizza per costruire. Makefile? Eclisse? Qualcos'altro? – dutt

+3

Nella versione più recente, probabilmente dovrai usare '-std = C++ 11'. Forse entrambi sono ammessi, però. –

+6

Manca molto contesto. Mostra il comando completo che hai provato (magari anche il codice di esempio che hai provato a compilare) e quello che in realtà non è riuscito. – KillianDS

risposta

386

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

Supponendo si invoca 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.

+6

Non dimenticarti di mettere '-Wall -g' subito dopo' g ++ ' –

+5

@BasileStarynkevitch: aggiungerei' -Werror' troppo, nessun motivo per non farlo all'avvio di un progetto. –

+0

Ha funzionato! Grazie mille! –

11

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

+0

Come puoi dire che sta usando Ubuntu? Sono solo curioso di sapere. – Shravan40

+9

@ OP Shravan40 dice esplicitamente 'Sto usando Ubuntu 12.04' nella domanda. –

8

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 ad esempio i dialetti C89 o C++ 98, e GNU di tali norme, come gnu89 o GNU ++ 98. Con specificando uno standard di base, il compilatore accetterà tutti i programmi seguendo tale standard e quelli che usano estensioni GNU che non lo contraddicano. . Ad esempio, -std = c89 disattiva alcune funzionalità di GCC 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 "?:". Sull'altra , specificando un dialetto GNU di uno standard, tutte le funzionalità del supporto del compilatore sono abilitate, anche quando tali funzionalità modificano il significato dello standard di base e alcuni programmi rigorosamente conformi possono essere rifiutati . Il particolare standard è usato da -pedantic per identificare quali funzionalità sono estensioni GNU data quella versione dello standard. Ad esempio-std = gnu89 -pedantic avviserà sullo stile C++ // commenti, mentre -std = gnu99 -pedantic non lo farebbe.

+0

E cosa ti porta, 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

39

È possibile controllare la g++ con il comando:

which g++ 
g++ --version 

questo vi dirà quale compilatore è attualmente sta indicando.

Per passare a g++ 4.7 (supponendo di aver installato nel vostro 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 selezionare 2 come selezione (La mia macchina già indicando g++ 4.7, in modo che il *)

Una volta che si accende il compilatore poi eseguire nuovamente g++ --version per verificare che la commutazione sia avvenuta correttamente.

Ora compilare il programma con

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

Potrebbe essere opportuno menzionare che versioni come g ++ 4.4 potrebbero essere semplicemente troppo vecchie per fare alcune funzionalità, quindi è necessario eseguire l'aggiornamento. L'aggiornamento dipenderà dal tuo sistema e eviterei i metodi per compilare te stesso g ++ e sostituire il compilatore del sistema come riferimento –