Compilando C ++ 11 com g ++

367

Estou tentando atualizar meu compilador C ++ para C ++ 11. Pesquisei um pouco e cheguei à conclusão de que tenho de usar a bandeira -std=c++0xou -std=gnu++0x, mas não sei muitas coisas sobre bandeiras. Alguém pode me ajudar? (Estou usando o Ubuntu 12.04.)

Aqui está o erro que eu recebo do compilador quando tento usar uma biblioteca que está incluída no C ++ 11 (ou seja, matriz):

#include <array>
#include <iostream>

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

Esse arquivo requer suporte do compilador e da biblioteca para o próximo padrão ISO C ++, C ++ 0x. Atualmente, esse suporte é experimental e deve ser ativado com as opções do compilador -std = c ++ 0x ou -std = gnu ++ 0x.

Rontogiannis Aristofanis
fonte
5
Na versão mais recente, você provavelmente precisará usar -std=c++11. Talvez ambos sejam permitidos, no entanto.
6
Isso perde muito contexto. Mostre o comando completo que você tentou (talvez até o código de exemplo que você tentou compilar) e o que realmente falhou.
KillianDS
4
@classdaknok_t: ambos devem ser permitido, também o Ubuntu 12.04 navios g++-4.6por padrão (que suporta apenas -std=c++0x)
KillianDS
3
Adicione sinalizadores logo após g++, por exemplo g++ -std=c++0x _filename_ && ./a.out.
n. 'pronomes' m.
11
Me deparei com esta postagem, procurando a mensagem de erro intitulada. Estou trabalhando em um projeto QMAKE, a solução para mim foi adicionar CONFIG + = c ++ 11 ao arquivo .pro.

Respostas:

529

Sinalizadores (ou opções do compilador) não passam de argumentos comuns da linha de comando passados ​​para o executável do compilador.

Supondo que você esteja chamando o 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.

Oskar N.
fonte
8
Não se esqueça de colocar -Wall -glogo apósg++
Basile Starynkevitch
7
@ BasileStarynkevitch: Eu acrescentaria -Werrortambém, não há razão para isso ao iniciar um projeto.
Matthieu M.
3
Um suporte melhor ao C ++ 11 é discutível e os diagnósticos melhores não parecem muito melhores atualmente (a página de Clang descrevendo eles usa o GCC 4.2, que é antigo) gcc.gnu.org/wiki/ClangDiagnosticsComparison ;)
Jonathan Wakely
58
Alguém sabe se / quando os compiladores C ++ oferecerão suporte ao padrão C ++ 11 por padrão, ou seja, sem um sinalizador?
Dennis
2
E caso você ainda não sabe, no Visual C ++ simplesmente usar VC11 (Visual Studio 2012) ou acima para ter C ++ 11 características
gerrytan
44

Você pode verificar seu g++comando:

which g++
g++ --version

isso informará qual complier está apontando no momento.

Para mudar para g++4.7 (assumindo que você o instalou 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 2como seleção (Minha máquina já está apontando para g++4.7, então o *)

Depois de trocar o complier, execute novamente g++ --versionpara verificar se a troca ocorreu corretamente.

Agora compile seu programa com

g++ -std=c++11 your_file.cpp -o main
Harajyoti Das
fonte
Pode valer a pena mencionar que versões como o g ++ 4.4 podem ser muito antigas para fazer alguns recursos, portanto, a atualização é necessária. A atualização vai depender do seu sistema, e eu gostaria de evitar métodos de compilação g ++ si mesmo e substituindo compilador do sistema para referência
Colin D
13

Seu ubuntu definitivamente possui uma versão suficientemente recente do g ++. A bandeira a ser usada é -std=c++0x.

Michael Slade
fonte
Como você pode dizer isso, ele está usando o ubuntu? Apenas curioso para saber.
usar o seguinte código
22
@ Shravan40 OP diz explicitamente I'm using Ubuntu 12.04.na pergunta.
Timothy Gu
10

Se você deseja 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 de manual:

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 base, o compilador aceitará todos os programas que seguem esse padrão e aqueles que usam extensões GNU que não o contradizem. Por exemplo, -std = c89 desativa certos recursos do GCC que são incompatíveis com a ISO C90, como as palavras-chave "asm" e "typeof", mas não outras extensões GNU que não tenham significado na 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 suportados pelo compilador são ativados, mesmo quando esses recursos alteram o significado do padrão base e alguns programas em conformidade estrita podem ser rejeitados. O padrão específico é usado pela -pedantic para identificar quais recursos são extensões GNU, dada essa versão do padrão. Por exemplo,-std = gnu89 -pedantic alertaria sobre o estilo C ++ // comentários, enquanto -std = gnu99 -pedantic não alertaria.


fonte
E o que isso leva a você, além do ?:operador binário ? A única outra extensão que vem à mente, expressões de estrutura, é substituída pela inicialização da lista do C ++ 11. De qualquer forma, essa citação refere-se principalmente a C, não a C ++.
precisa saber é o seguinte
9

Você pode consultar o link a seguir, para o qual os recursos são suportados na versão específica do compilador. Possui uma lista exaustiva de suporte a recursos no compilador. Parece que o GCC segue o padrão de perto e implementa antes de qualquer outro compilador.

Em relação à 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++2apara C ++ 20, embora todos os recursos do C ++ 20 ainda não sejam suportados, consulte este link para obter a lista de suporte de recursos no GCC.

A lista muda muito rapidamente, fique de olho na lista, se você estiver aguardando o suporte de um recurso específico.

yadhu
fonte