2010-05-22 13 views
16

Estoy leyendo el manual de gcc en este momento, especialmente la parte sobre banderas de advertencia/error. Después de leer la parte sobre la bandera de -extra, me pregunto si es útil en absoluto. Parece que se queja de cosas que parecen ser más bien subjetivas o una cuestión de gusto. No soy tan experimentado con gcc, solo lo uso de vez en cuando para algunos proyectos pequeños en la universidad, entonces para todos los C/C++ experimentados (o para cualquier idioma que uses gcc), ¿cuál es el trato con -Wextra?-Wextra ¿qué tan útil es realmente?

Respuesta

22

-Wextra, entre otras cosas implica -Wtype-limits:

Advertir cuando una comparación siempre es verdadera o siempre es falsa debido al rango limitado del tipo de datos, pero no avisa de expresiones constantes . Por ejemplo, advertir si una variable sin signo es comparado con cero con '<' o '> ='. Esta advertencia también está habilitada por -Wextra.

Encuentro esto realmente útil.

7

Normalmente agrego -Wno-sign-compare y -Wno-unused-parameter para eliminar el ruido.

El implícita -Wuninitialized (con la opción -O2) ha sido muy útil para mí, pero añadiendo inicialmente a su base de código puede ser un poco intimidante. Una forma de hacer frente a esto es agregar dos macros (que parecen un poco extraño: el signo igual es intencional):

#define ELIMINATE_GCC_WARNING = 0 // used to remove nuisance warnings 
#define UNCHECKED_GCC_WARNING = 0 // not yet verified 

A continuación, se puede eliminar rápidamente las advertencias de gcc y obtener una compilación limpia utilizando, por ejemplo:

int foo UNCHECKED_GCC_WARNING; 

Luego, como paso opcional, retroceda y compruebe estas adiciones, y cámbielas una por una a ELIMINATE_GCC_WARNING. Esto puede ser lento. Pero me sorprendería si no encontraras algunos errores existentes.

+1

Encuentro '-Wno-unused-parameter' útil especialmente cuando el código fuente viejo cambia con el paso de los años, a veces los valores terminan siendo pasados ​​por funciones anidadas que ni siquiera se usan. Sugerir definir UNUSED. '#define SIN USAR (x) UNUSED_ ## x __attribute __ ((__ __ no utilizado))' A continuación, se puede envolver argumentos como este ... 'void func (int a, int SIN USAR (b)) {... } ' También es bueno que si el argumento necesita ser utilizado más adelante, GCC no permitirá que esto suceda sin eliminar el atributo UNUSED(). – ideasman42

Cuestiones relacionadas