¿Cuáles son las diferencias entre -std = c ++ 11 y -std = gnu ++ 11?

132

¿Cuáles son las diferencias entre -std=c++11y -std=gnu++11como parámetro de compilación para gcc y clang? La misma pregunta con c99y gnu99? Sé acerca de los estándares C ++ y C, son las diferencias en los parámetros que me interesan.

He leído en alguna parte que tiene que ver con algunas extensiones, pero no tengo claro cuáles y cómo elegir entre una u otra para un nuevo proyecto.

Klaim
fuente
55
Los gnuque se refieren a extensiones, y si desea escribir código portátil, debe apegarse a un estándar y evitar las extensiones por completo.
juanchopanza

Respuestas:

91

Como usted mismo descubrió, la diferencia entre las dos opciones es si las extensiones GNU que violan / extienden el estándar C ++ están habilitadas o no. Las extensiones GNU C ++ se describen aquí . También puede usar la mayoría de las extensiones GNU C (descritas aquí ) en sus programas C ++. También sería útil leer sobre la -Wpedanticopción GCC aquí .

Tenga en cuenta que algunas extensiones aún pueden estar vigentes cuando se usan -std=c++11, siempre que no contradigan el estándar. Por ejemplo, cuando uso el compilador MinGW, necesito las extensiones para trabajar Boost.Lexical_Cast. Pero, siempre que no use ninguno de ellos, es mejor que se adhiera al estándar sin extensiones para una portabilidad máxima. Esto puede ser útil si se ve obligado a cambiar el compilador.

daramarak
fuente
44
Sí, evito las extensiones porque no recomiendo hacer nada que no esté específicamente definido por el Estándar ... pero aun así, "violar" es un término extraño y cargado, cuando muchas de estas extensiones lo son, para usar Standardese , simplemente definiendo la implementación o especificando cosas en las que el Estándar no dice nada, o tal vez incluso todas las extensiones ... ¿Tiene alguna cita para cualquier extensión GNU que viole el Estándar al hacer algo diferente de algo que el Estándar define explícitamente?
underscore_d
9
Si bien esta respuesta es buena en general, ¿consideraría editarla para al menos enumerar las extensiones que están habilitadas gnu11pero no habilitadas c++11? La lista a la que se vinculó es de todas las extensiones, y como usted mismo indica, algunas de ellas también están habilitadas c++11(me gusta __restrict__).
einpoklum
Lo que descubrí ahora, y nunca concluiría mirando la documentación de las banderas, es lo siguiente: -std = c ++ 11 vuelve a habilitar los trigrafos -std = gnu ++ 11 los ignora y emite una advertencia, como esta lo hace al omitir -std todo junto
Daniel82