2010-04-04 17 views
16

sólo estoy cavando en el manual de gcc y algunas cosas aún no están claras para mí:gcc: ¿Está utilizando -Werror y -pedantic como una buena práctica?

  1. Al especificar un std, debe siempre utilizar -pedantic en conjunto?
  2. Al usar -g, ¿es suficiente el nivel estándar o debo especificar el nivel 3, es decir, -g3?
  3. ¿Es una buena práctica utilizar -Werror para promover todas las advertencias a errores y -pedantic-errors para promover todas las advertencias pedantes a los errores?

Respuesta

19

Si está escribiendo una biblioteca, por favor hacer asegurarse de que un programa sencillo como

#include <yourlib.h> 
int main() { 
    return 0; 
} 

compila sin ninguna advertencia en absoluto, incluso cuando el compilador está funcionando en el modo más pedante con todas las advertencias opcionales habilitadas .

Si está escribiendo una aplicación, su código que arroja advertencias a la izquierda y derecha es solo el problema de su aplicación. Sin embargo, con el archivo de encabezado público de una biblioteca, todo el mundo que luego use esa biblioteca se verá obligado a ignorar o soportar las advertencias que su código está causando.

Así que por favor compruebe que los encabezados de biblioteca compila sin advertencias, si es posible en múltiples modos de compilación:

$ gcc -Wall -Wextra -Werror -std=c99 -pedantic 
$ gcc -Wall -Wextra -Werror -std=gnu99 -pedantic 
$ gcc -Wall -Wextra -Werror -std=c89 -pedantic 
$ gcc -Wall -Wextra -Werror -std=gnu89 -pedantic 
+5

Algunos códigos C99 no son válidos Código C89, que no lo convierte en código incorrecto. La portabilidad entre los dos solo es necesaria si dicha portabilidad es en realidad un objetivo declarado del proyecto. –

+0

+1 Leí sobre la bandera de "Extra" pero no me pareció demasiado útil, pero como casi todos lo recomiendan, parece ser útil. ¿Pero por qué? ¿Para qué es realmente bueno? – helpermethod

+0

@Neil: para aplicaciones, sí. Sin embargo, el archivo de encabezado API público de una biblioteca no debe imponer C99 o C89 al programa que lo incluye. De lo contrario, una biblioteca necesita C89 (pero no C99) y la otra necesita C99 (pero no C89) y como escritor de la aplicación que interactúa con ambas bibliotecas estoy atornillado. – ndim

3

Me gusta usar -Wall -Wextra para C++. Sin embargo, si -Wextra informa las advertencias en los encabezados de las bibliotecas que uso, generalmente lo dejo caer.

+1

¿Qué dejo caer - '-Wextra' o el encabezado de la biblioteca tonta? (Sugerencia: ¡debería ser lo último! ;-)) –

+1

Use -isistema en lugar de -I para especificar la ruta del encabezado de la biblioteca. –

+0

-Wextra tiende a tener una tasa mucho más alta de falsos positivos que, sin embargo, "Wall" es el problema. –

7

Todos estos son asuntos de opinión y/o dependen de la base de código y las prácticas de programación. Siempre compilo con -Wall y -pedantic, no me importa si las cosas están marcadas como errores o advertencias, así que nunca uso -Werror, y rara vez depuro el código usando el depurador, cuando lo hago, es suficiente -g. Alguien más podría llegar a una respuesta completamente diferente.

6

Estos son todos altamente subjetiva. Aquí están mis opiniones:

  1. La utilización del -pedantic no debe estar atado a su uso de -std=foo. Use -pedantic si desea mensajes de errores pedantes; Si está utilizando -pedantic, probablemente también desee -Wall y -Wextra, ya que su objetivo suele ser detectar todos los posibles errores, sin importar cuán insignificantes sean. Tenga en cuenta que -pedantic no detectará todas las advertencias posibles de, solo las advertencias para las que el estándar ISO C requiere un diagnóstico.

  2. Siempre he encontrado que el nivel 2 (el predeterminado con -g) es lo suficientemente bueno para mis propósitos. El nivel 3 también incluye información sobre todas las definiciones de macro en su programa, pero eso solo es útil si su depurador admite ampliaciones de macros; el mío no (GNU gdb 6.3.50-20050815 (versión de Apple gdb-696)). No sé qué más incluye el nivel 3 que el nivel 2 no.

  3. Eso depende.Si su objetivo es hacer el código más portátil y más compatible con los estándares, entonces sí, recomiendo siempre usar -Werror y -pedantic-error (junto con -Wall y -Wextra), especialmente al iniciar nuevos proyectos. Sin embargo, si está comenzando con una gran base de código, activar estas opciones probablemente le dará toneladas de errores falsos e inofensivos, especialmente para cosas como falta de coincidencia firmado/no firmado y conversiones implícitas entre varios tipos. Le tomará mucho tiempo arreglar una base de código para eliminar estos errores, por lo que no lo recomendaría.

    Si está haciendo un proyecto de desecho rápido, no se moleste, ya que estos solo lo retrasarán.

    Si está trabajando en una biblioteca o algo que se abrirá como fuente abierta, enciéndalos. Sus usuarios apreciarán mucho el hecho de que su código no produzca errores ni advertencias. También tome ndim's advice en cuenta.

Cuestiones relacionadas