Compilar C ++ 11 con g ++

367

Estoy tratando de actualizar mi compilador de C ++ a C ++ 11. He buscado un poco y he llegado a la conclusión de que tengo que usar la bandera -std=c++0xo -std=gnu++0x, pero no sé muchas cosas sobre las banderas. ¿Alguien puede ayudarme? (Estoy usando Ubuntu 12.04.)

Aquí está el error que obtengo del compilador cuando intento usar una biblioteca que está incluida en C ++ 11 (es decir, matriz):

#include <array>
#include <iostream>

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

Este archivo requiere soporte de compilador y biblioteca para el próximo estándar ISO C ++, C ++ 0x. Este soporte es actualmente experimental y debe habilitarse con las opciones del compilador -std = c ++ 0x o -std = gnu ++ 0x.

Rontogiannis Aristofanis
fuente
55
En la versión más reciente, probablemente tengas que usarlo -std=c++11en su lugar. Quizás ambos están permitidos, sin embargo.
66
Esto pierde mucho contexto. Muestra el comando completo que has probado (tal vez incluso el código de muestra que intentaste compilar) y lo que realmente falló.
KillianDS
44
@classdaknok_t: ambos deberían estar permitidos, también ubuntu 12.04 se envía g++-4.6por defecto (que solo es compatible -std=c++0x)
KillianDS
3
Agregar banderas justo después g++, por ejemplo g++ -std=c++0x _filename_ && ./a.out.
n. 'pronombres' m.
1
Encontré esta publicación, buscando un mensaje de error titulado. Estoy trabajando en un proyecto QMAKE, la solución para mí fue agregar CONFIG + = c ++ 11 al archivo .pro.

Respuestas:

529

Las banderas (u opciones del compilador) no son más que argumentos de línea de comandos comunes pasados ​​al ejecutable del compilador.

Suponiendo que está invocando g ++ desde la línea de comando (terminal):

$ g++ -std=c++11 your_file.cpp -o your_program

o

$ g++ -std=c++0x your_file.cpp -o your_program

Si lo anterior no funciona.

Oskar N.
fuente
8
No te olvides de poner -Wall -gjusto despuésg++
Basile Starynkevitch
77
@BasileStarynkevitch: Yo agregaría -Werrortambién, no hay razón para no hacerlo al comenzar un proyecto.
Matthieu M.
3
El mejor soporte de C ++ 11 es discutible y los mejores diagnósticos no se ven mucho mejor en estos días (la página de Clang que los describe usa GCC 4.2 que es antigua) gcc.gnu.org/wiki/ClangDiagnosticsComparison ;)
Jonathan Wakely
58
¿Alguien sabe si / cuándo los compiladores de C ++ admitirán el estándar C ++ 11 de forma predeterminada, es decir, sin una bandera?
Dennis
2
Y en caso de que aún no lo sepa, en Visual C ++ simplemente use VC11 (Visual Studio 2012) o superior para tener características de C ++ 11
gerrytan
44

Puede verificar su g++por comando:

which g++
g++ --version

esto le dirá qué compilador está apuntando actualmente.

Para cambiar a g++4.7 (suponiendo que lo haya instalado en su máquina), ejecute:

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

Luego seleccione 2como selección (Mi máquina ya apunta a g++4.7, entonces el *)

Una vez que cambie el cumplidor, vuelva a ejecutarlo g++ --versionpara verificar que el cambio se haya realizado correctamente.

Ahora compile su programa con

g++ -std=c++11 your_file.cpp -o main
Harajyoti Das
fuente
Vale la pena mencionar que versiones como g ++ 4.4 pueden ser simplemente demasiado antiguas para hacer algunas funciones, por lo que es necesario actualizar. La actualización dependerá de su sistema, y ​​evitaría los métodos para compilar g ++ usted mismo y reemplazar el compilador del sistema como referencia
Colin D
13

Su ubuntu definitivamente tiene una versión suficientemente reciente de g ++. La bandera a usar es -std=c++0x.

Michael Slade
fuente
¿Cómo puedes decir eso, él está usando ubuntu? Solo curiosidad por saberlo.
Shravan40
22
@ Shravan40 OP dice explícitamente I'm using Ubuntu 12.04.en la pregunta.
Timothy Gu
10

Si desea mantener las extensiones del compilador GNU, use -std = gnu ++ 0x en lugar de -std = c ++ 0x. Aquí hay una cita de la página del manual:

El compilador puede aceptar varios estándares básicos, como c89 o c ++ 98, y dialectos GNU de esos estándares, como gnu89 o gnu ++ 98. Al especificar un estándar base, el compilador aceptará todos los programas que siguen ese estándar y aquellos que usan extensiones GNU que no lo contradicen. Por ejemplo, -std = c89 desactiva ciertas características de GCC que son incompatibles con ISO C90, como las palabras clave "asm" y "typeof", pero no otras extensiones GNU que no tienen un significado en ISO C90, como omitir El término medio de una expresión "?:". Por otro lado, al especificar un dialecto GNU de un estándar, se habilitan todas las características que admite el compilador, incluso cuando esas características cambian el significado del estándar base y algunos programas que cumplen estrictamente pueden ser rechazados. El estándar particular es utilizado por -pedantic para identificar qué características son extensiones GNU dada esa versión del estándar. Por ejemplo,-std = gnu89 -pedantic advertiría sobre el estilo C ++ // comentarios, mientras que -std = gnu99 -pedantic no lo haría.


fuente
¿Y qué te trae eso, aparte del ?:operador binario ? La única otra extensión que viene a la mente, las expresiones de estructura, es reemplazada por la inicialización de la lista de C ++ 11. En cualquier caso, esta cita se refiere principalmente a C, no a C ++.
Potatoswatter
9

Puede consultar el siguiente enlace para ver qué características son compatibles con una versión particular del compilador. Tiene una lista exhaustiva de soporte de características en el compilador. Parece que GCC sigue de cerca el estándar y lo implementa antes que cualquier otro compilador.

Con respecto a su pregunta, puede 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, aunque todavía no se admiten todas las funciones de C ++ 20, consulte este enlace para ver la lista de funciones admitidas en GCC.

La lista cambia bastante rápido, manténgase atento a la lista, si está esperando que se admita una función particular.

yadhu
fuente