¿Cuál es el propósito de usar -pedantic en el comstackdor GCC / G ++?

Esta nota dice:

-ansi : le dice al comstackdor 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 comstackdor 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 comstackdor 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?

Los comstackdores de GCC siempre intentan comstackr su progtwig si esto es posible. Sin embargo, en algunos casos, los estándares de C y C ++ especifican que ciertas extensiones están prohibidas. Los comstackdores conformes como gcc o g ++ deben emitir un diagnóstico cuando se encuentran estas extensiones. Por ejemplo, la opción -pedantic del comstackdor 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 comstackción falle en dichos puntos. Solo aquellas construcciones que no sean ISO que deben ser marcadas por un comstackdor conforme generarán advertencias o errores.

Lo uso todo el tiempo en mi encoding.

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 comstackdor 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 comstackdor puede aceptar cadenas más largas y, sin las advertencias pedantes, GCC las aceptará también.

Básicamente, hará que su código sea mucho más fácil de comstackr bajo otros comstackdores 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).

-ansi es un switch obsoleto que solicita al comstackdor 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 progtwigció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 comstackdores GCC C recientes se ajustarán al lenguaje C estandarizado en ISO / IEC 9899: 2011 . Desafortunadamente, hay algunos vendedores de comstackdores perezosos que creen que es aceptable apegarse a la revisión estándar del comstackdor, 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 comstackrá en estos comstackdores 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 progtwig

 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 syntax, 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 comstack el progtwig con gcc -c -std=c90 pedantic_test.c , no se produce ninguna advertencia.

-pedantic hace que el comstackdor 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.

Si su código necesita ser portable , puede probar que comstack sin extensiones gcc u otras características no estándar. Si su código se comstack con -pedantic -ansi , en teoría debería comstackr OK con cualquier otro comstackdor estándar ANSI.

Si está escribiendo un código que prevé que va a comstackrse en una amplia variedad de plataformas, con varios comstackdores diferentes, entonces usar estos indicadores usted mismo ayudará a asegurarse de no producir código que solo comstack bajo GCC.

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 comstackdores (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 comstackdor gcc rechace todas las extensiones GNU C no solo las que lo hacen compatible con ANSI.