Esta nota dice:
-ansi
: le dice al compilador que implemente la opción de lenguaje ANSI. Esto desactiva ciertas "características" de GCC que son incompatibles con el estándar ANSI.
-pedantic
: usado en conjunto con-ansi
, esto le dice al compilador que se adhiera estrictamente al estándar ANSI, rechazando cualquier código que no sea compatible.
Lo primero es lo primero:
- ¿Cuál es el propósito
-pedantic
y las-ansi
opciones del compilador GCC / G ++ (no pude entender la descripción anterior)? - ¿Alguien puede decirme las circunstancias correctas para usar estas dos opciones?
- ¿Cuándo debo usarlos?
- ¿Son importantes?
Lo uso todo el tiempo en mi codificación.
La
-ansi
bandera es equivalente a-std=c89
. Como se señaló, desactiva algunas extensiones de GCC. Agregar-pedantic
desactiva más extensiones y genera más advertencias. Por ejemplo, si tiene una cadena literal de más de 509 caracteres,-pedantic
advierte sobre eso porque excede el límite mínimo requerido por el estándar C89. Es decir, cada compilador C89 debe aceptar cadenas de longitud 509; se les permite aceptar más tiempo, pero si usted es pedante, no es portátil usar cadenas más largas, aunque un compilador puede aceptar cadenas más largas y, sin las advertencias pedantes, GCC también las aceptará.fuente
-std=c89 -pedantic
significa que puede moverse más fácilmente entre diferentes compiladores en otras plataformas. Tan pronto como empiece a usar<windows.h>
, la compatibilidad con otros sistemas se vuelve problemática.-pedantic
, pero la mayoría de mi código aún se compila OK cuando lo vuelvo a habilitar (el único programa que no estaba usando explícitamente los__int128
tipos, que son pedante incorrectamente). Creo que hubo una etapa de intervención cuando GCC era demasiado ruidoso (para mi gusto)-pedantic
. Acabo de probar unos 300 archivos de origen, algunos códigos de biblioteca, algunos comandos, algunos programas de prueba SO, y solo había un problema que era de esperar. Actualmente usando GCC 4.8.2 en Mac OS X 10.9.2.-ansi
es un conmutador obsoleto que solicita al compilador que compile de acuerdo con la revisión obsoleta de 30 años del estándar C , ISO / IEC 9899: 1990 , que es esencialmente un cambio de marca del estándar ANSI X3.159-1989 "Lenguaje de programación C" . ¿Por qué es obsoleto? Porque después de que C90 fue publicado por ISO, ISO ha estado a cargo de la estandarización de C, y cualquier corrección técnica a C90 ha sido publicada por ISO. Por lo tanto, es más apto para usar el-std=c90
.Sin este cambio, los recientes compiladores GCC C se ajustarán al lenguaje C estandarizado en ISO / IEC 9899: 2011 , o la última revisión de 2018.
Desafortunadamente, hay algunos vendedores de compiladores perezosos que creen que es aceptable apegarse a una revisión estándar obsoleta más antigua, para la cual el documento de estandarización ni siquiera está disponible en los organismos estándar.
El uso del conmutador ayuda a garantizar que el código se compile en estos compiladores obsoletos.
El
-pedantic
es uno interesante. En ausencia de-pedantic
, incluso cuando se solicita un estándar específico, GCC aún permitirá algunas extensiones que no son aceptables en el estándar C. Considere por ejemplo el programaEl C11 borrador n1570 párrafo 6.7.6.2p1 dice :
El estándar C requiere que la longitud de la matriz sea mayor que cero; y este párrafo está en las restricciones ; El estándar dice lo siguiente 5.1.1.3p1 :
Sin embargo, si compila el programa
gcc -c -std=c90 pedantic_test.c
, no se genera ninguna advertencia.-pedantic
hace que el compilador cumpla realmente con el estándar C ; así que ahora producirá un mensaje de diagnóstico, como lo requiere el estándar:Por lo tanto, para una portabilidad máxima, especificar la revisión estándar no es suficiente, también debe usar
-pedantic
(o-pedantic-errors
) para asegurarse de que GCC realmente cumpla con la letra del estándar.La última parte de la pregunta fue sobre el uso
-ansi
con C ++ . ANSI nunca estandarizó el lenguaje C ++, solo lo adoptó de ISO, por lo que tiene tanto sentido como decir "Inglés estandarizado por Francia". Sin embargo, GCC todavía parece aceptarlo para C ++, por estúpido que parezca.fuente
-std=c11 -Wall -Wextra -Wpedantic -Wconversion
.Básicamente, hará que su código sea mucho más fácil de compilar en otros compiladores que también implementan el estándar ANSI y, si tiene cuidado con las bibliotecas / llamadas API que usa, en otros sistemas operativos / plataformas.
El primero, desactiva las características ESPECÍFICAS de GCC. (-ansi) El segundo, se quejará de CUALQUIER COSA que no cumpla con el estándar (no solo las características específicas de GCC, sino también sus construcciones). (-pedantic).
fuente
Si su código necesita ser portátil , puede probar que se compila sin extensiones gcc u otras características no estándar. Si su código se compila,
-pedantic -ansi
entonces en teoría debería compilar OK con cualquier otro compilador estándar ANSI.fuente
-pedantic
no desactiva todas las extensiones, deja en un montón de cosas de doble subrayado. Por lo tanto, podría ser más exacto decir que si su código se compila-pedantic -ansi
, y también parece posible que se compile en otras implementaciones, entonces se compilará.Si está escribiendo el código que prevé que se compilará en una amplia variedad de plataformas, con varios compiladores diferentes, entonces usar estos indicadores usted mismo ayudará a garantizar que no produzca código que solo se compila bajo GCC.
fuente
Otros han respondido lo suficiente. Solo me gustaría agregar algunos ejemplos de extensiones frecuentes:
La
main
función regresavoid
. Esto no está definido por el estándar, lo que significa que solo funcionará en algunos compiladores (incluido GCC), pero no en otros. Por cierto,int main()
yint main(int, char**)
son las dos firmas que define el estándar.Otra extensión popular es poder declarar y definir funciones dentro de otras funciones:
Esto no es estándar. Si desea este tipo de comportamiento, consulte C ++ 11 lambdas
fuente
Pedantic hace que el compilador gcc rechace todas las extensiones de GNU C, no solo las que lo hacen compatible con ANSI.
fuente