-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 programa
struct test {
int zero_size_array[0];
};
El C11 borrador n1570 párrafo 6.7.6.2p1 dice :
Además de los calificadores de tipo opcionales y la palabra clave static, [y] pueden delimitar una expresión o *. Si delimitan una expresión (que especifica el tamaño de una matriz), la expresión tendrá un tipo entero. Si la expresión es una expresión constante, tendrá un valor mayor que cero. [...]
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 :
Una implementación conforme producirá al menos un mensaje de diagnóstico (identificado de una manera definida por la implementación) si una unidad de traducción o unidad de traducción de preprocesamiento contiene una violación de cualquier regla o restricción de sintaxis, incluso si el comportamiento también se especifica explícitamente como indefinido o implementación. definido. Los mensajes de diagnóstico no necesitan ser producidos en otras circunstancias.9)
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:
gcc -c -pedantic -std=c90 pedantic_test.c
pedantic_test.c:2:9: warning: ISO C forbids zero-size array ‘zero_size_array’ [-Wpedantic]
int zero_size_array[0];
^~~~~~~~~~~~~~~
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.