Compilando o C ++ 11 com g ++

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  #include  int main() { std::array 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 comuns de linha de comando passados ​​para o executável do compilador.

Supondo que você está invocando g ++ na 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.

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 (supondo que você 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 

Seu ubuntu definitivamente tem uma versão suficientemente recente do g ++. O sinalizador para usar é -std=c++0x .

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 resources 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 resources do suporte ao compilador são ativados, mesmo quando esses resources 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 resources 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 resources são suportados em uma versão específica do compilador. Tem uma lista exaustiva de suporte a resources 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 resources do C ++ 20 ainda não sejam suportados, consulte este link para a lista de suporte a resources no GCC.

A lista muda muito rapidamente, fique de olho na lista, se você estiver esperando por um determinado recurso para ser suportado.