¿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.


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.