2012-05-16 14 views
98

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

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

+5

Los 'gnu' 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

Respuesta

66

Como ha descubierto usted mismo, la diferencia entre las dos opciones es si las extensiones de GNU que infringen el estándar de C++ están habilitadas o no. Las extensiones de GNU se describen here. Tenga en cuenta que algunas extensiones todavía pueden estar vigentes al usar -std=c++11, siempre que no contradigan el estándar.

Por ejemplo, cuando se utiliza el compilador MinGW, necesito las extensiones para un Boost.Lexical_Cast que funcione. Pero, mientras no use ninguno de ellos, es mejor que se apegue al estándar sin extensiones para una máxima portabilidad. Esto podría ser útil si se ve obligado a cambiar el compilador.

+4

En muchos casos, las extensiones no violan el estándar –

+2

Sí, evito las extensiones porque no recomiendo hacer nada que no esté específicamente definido por el estándar ... pero incluso entonces, "viola" es extraño y está cargado término, cuando muchas de estas extensiones son, para usar Standardese, simplemente _implementation-defining_ o _specifying_ cosas sobre las que el estándar no se pronuncia, o quizás incluso todas las extensiones ... ¿Tiene una cita para cualquier extensión de GNU que viole el ¿Estándar haciendo algo diferente de algo que el Estándar define explícitamente? –

+4

Si bien esta respuesta es buena, ¿consideraría editarla para al menos enumerar las extensiones habilitadas en 'gnu11' pero no en' C++ 11'? La lista a la que vinculó es de todas las extensiones, y como usted mismo indica, algunas de ellas también están habilitadas con 'C++ 11' (como' __restrict__'). – einpoklum

Cuestiones relacionadas