c++ - mac - ¿Cuál es el propósito de usar-pedantic en el compilador GCC/G++?
g++ ubuntu (8)
Esta nota dice:
-ansi
: le dice al compilador que implemente la opción de idioma ANSI. Esto desactiva ciertas "características" de GCC que son incompatibles con el estándar ANSI.
-pedantic
: usado en conjunción 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 de las opciones
-pedantic
y-ansi
del compilador GCC / G ++ (no pude entender la descripción anterior)? - ¿Alguien puede decirme las circunstancias correctas para usar estas dos opciones?
- ¿Cuándo debería usarlos?
- ¿Son importantes?
Básicamente, hará que su código sea mucho más fácil de compilar bajo otros compiladores que también implementen el estándar ANSI, y, si tiene cuidado con las bibliotecas / llamadas de 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 se adhiera al estándar (no solo características específicas de GCC, sino también sus construcciones) (-pedante).
Lo uso todo el tiempo en mi codificación.
La bandera -ansi
es equivalente a -std=c89
. Como se señaló, desactiva algunas extensiones de GCC. Agregar -pedantic
apaga más extensiones y genera más advertencias. Por ejemplo, si tiene un literal de cadena de más de 509 caracteres, entonces -pedantic
advierte 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 se 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 las aceptará también.
Los compiladores de GCC siempre intentan compilar su programa si esto es posible. Sin embargo, en algunos casos, los estándares de C y C ++ especifican que ciertas extensiones están prohibidas. Los compiladores conformes como gcc o g ++ deben emitir un diagnóstico cuando se encuentran estas extensiones. Por ejemplo, la opción -pedantic del compilador gcc hace que gcc emita advertencias en tales casos. El uso de la opción -pedantic-errors
convierte dichos avisos de diagnóstico en errores que harán que la compilación falle en dichos puntos. Solo aquellas construcciones que no sean ISO que deben ser marcadas por un compilador conforme generarán advertencias o errores.
Otros han respondido lo suficiente. Me gustaría agregar algunos ejemplos de extensiones frecuentes:
La función main
vuelve void
. 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()
e int 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:
void f()
{
void g()
{
// ...
}
// ...
g();
// ...
}
Esto no es estándar. Si quieres este tipo de comportamiento, revisa C ++ 11 lambdas
Pedantic lo hace para que el compilador gcc rechace todas las extensiones GNU C no solo las que lo hacen compatible con ANSI.
Si está escribiendo un código que prevé que va a compilarse en una amplia variedad de plataformas, con varios compiladores diferentes, entonces usar estos indicadores usted mismo ayudará a asegurarse de no producir código que solo compila bajo GCC.
Si su código necesita ser portable , puede probar que compila sin extensiones gcc u otras características no estándar. Si su código se compila con -pedantic -ansi
, en teoría debería compilar OK con cualquier otro compilador estándar ANSI.
-ansi
es un switch obsoleto que solicita al compilador que compile de acuerdo con la revisión obsoleta de 27 años del estándar C , ISO / IEC 9899: 1990 , que es esencialmente un cambio de nombre del estándar ANSI X3.159-1989 "Lenguaje de programación" C. ¿Por qué obsoleto? Porque después de que C90 fue publicado por ISO, ISO se ha encargado de la estandarización C, y cualquier corrigenda técnica de C90 ha sido publicada por ISO. Por lo tanto, es más apropiado usar -std=c90
.
Sin este cambio, los compiladores GCC C recientes se ajustarán al lenguaje C estandarizado en ISO / IEC 9899: 2011 . Desafortunadamente, hay algunos vendedores de compiladores perezosos que creen que es aceptable apegarse a la revisión estándar del compilador, para la cual el documento de estandarización ni siquiera está disponible en los organismos estándar. El uso del interruptor garantiza que el código compilará en estos compiladores obsoletos.
El -pedantic
es 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 de C. Considere por ejemplo el programa
struct test {
int zero_size_array[0];
};
El borrador C11 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 de 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 de preprocesamiento o unidad de traducción contiene una violación de cualquier regla o restricción de sintaxis, incluso si el comportamiento también se especifica explícitamente como no definido o implementado. definido. Los mensajes de diagnóstico no necesitan ser producidos en otras circunstancias.9)
Sin embargo, si compila el programa con gcc -c -std=c90 pedantic_test.c
, no se produce ninguna advertencia.
-pedantic
hace que el compilador realmente cumpla con el estándar C ; por lo que ahora generará una advertencia, tal como lo exige la norma:
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 el estándar no es suficiente, también debe usar -pedantic
(o -pedantic-errors
) para garantizar que GCC realmente cumpla con la letra del estándar.
La última parte de la pregunta fue sobre usar -ansi
con C ++ . ANSI nunca estandarizó el lenguaje C ++, solo lo adoptó desde ISO, por lo que tiene más sentido que decir "Inglés estandarizado por Francia". Sin embargo, GCC todavía parece aceptarlo para C ++, por estúpido que parezca.