c++ - compile - g++ version
Compilando o C++ 11 com g++ (4)
Estou tentando atualizar meu compilador C ++ para o C ++ 11. Eu procurei um pouco e cheguei à conclusão de que eu tenho que usar o flag -std=c++0x
ou -std=gnu++0x
, mas eu não sei muitas coisas sobre bandeiras. Alguém pode me ajudar? (Estou usando o Ubuntu 12.04.)
Aqui está o erro que recebo do compilador quando tento usar uma biblioteca que está incluída no C ++ 11 (ie array):
#include <array>
#include <iostream>
int main()
{
std::array<int, 3> arr = {2, 3, 5};
...
}
Este arquivo requer suporte a compilador e biblioteca para o próximo padrão ISO C ++, C ++ 0x. Esse suporte é atualmente experimental e deve ser ativado com as opções de compilador -std = c ++ 0x ou -std = gnu ++ 0x.
Bandeiras (ou opções de compilador) não são nada além de argumentos de linha de comando comuns passados para o executável do compilador.
Supondo que você esteja chamando g ++ da linha de comando (terminal):
$ g++ -std=c++11 your_file.cpp -o your_program
ou
$ g++ -std=c++0x your_file.cpp -o your_program
se o acima não funcionar.
Se você quiser manter as extensões do compilador GNU, use -std = gnu ++ 0x em vez de -std = c ++ 0x. Aqui está uma citação da página man:
O compilador pode aceitar vários padrões básicos, como c89 ou c ++ 98, e dialetos GNU desses padrões, como gnu89 ou gnu ++ 98. Ao especificar um padrão básico, o compilador aceitará todos os programas seguindo esse padrão e aqueles que usarem extensões do GNU que não o contradigam. Por exemplo, -std = c89 desativa determinados recursos do GCC que são incompatíveis com o ISO C90, como as palavras-chave "asm" e "typeof", mas não outras extensões do GNU que não têm significado no ISO C90, como omitir o termo do meio de uma expressão "?:". Por outro lado, ao especificar um dialeto GNU de um padrão, todos os recursos do suporte ao compilador são ativados, mesmo quando esses recursos alteram o significado do padrão base e alguns programas de conformidade estrita podem ser rejeitados. O padrão específico é usado por -pedantic para identificar quais recursos são extensões do GNU, dada a versão do padrão. Por exemplo, std = gnu89 -pedantic avisa sobre o estilo C ++ // comments, enquanto -std = gnu99 -pedantic não.
Você pode consultar o seguinte link para quais recursos são suportados em uma versão específica do compilador. Tem uma lista exaustiva de suporte de recursos no compilador. Parece GCC segue padrão de perto e implementa antes de qualquer outro compilador.
Quanto à sua pergunta, você pode compilar usando
-
g++ -std=c++11
para C ++ 11 -
g++ -std=c++14
para C ++ 14 -
g++ -std=c++17
para C ++ 17 -
g++ -std=c++2a
para C ++ 20, embora todos os recursos do C ++ 20 ainda não sejam suportados, consulte este link para a lista de suporte ao recurso no GCC.
A lista muda muito rapidamente, fique de olho na lista, se você estiver esperando por um determinado recurso para ser suportado.
Você pode verificar seu comando g++
por:
which g++
g++ --version
isso lhe dirá qual complium está apontando atualmente.
Para mudar para g++
4.7 (assumindo que você o tenha instalado em sua máquina), execute:
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
Em seguida, selecione 2
como seleção (minha máquina já aponta para g++
4.7, então o *)
Depois de alternar o complier, execute novamente g++ --version
para verificar se a comutação ocorreu corretamente.
Agora compile seu programa com
g++ -std=c++11 your_file.cpp -o main