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

  1. g++ -std=c++11 para C ++ 11
  2. g++ -std=c++14 para C ++ 14
  3. g++ -std=c++17 para C ++ 17
  4. 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




flags