2008-12-22 16 views
54

Tengo un montón de tiempo de compilación afirma, tales como:¿Cómo puedo ocultar las advertencias "definidas pero no usadas" en GCC?

CASSERT(isTrue) or CASSERT2(isTrue, prefix_) 

Al compilar con GCC consigo muchas advertencias como 'prefix_LineNumber' defined but not used. ¿Existe alguna manera de ocultar las advertencias para el tiempo de compilación? No tuve suerte buscando la documentación de GCC. Pensé que podría tener la var automáticamente utilizada globalmente dentro de la misma macro pero no podía pensar en ninguna forma de hacerlo.

¿Alguien sabe de una manera de ocultar esa advertencia en GCC?

Respuesta

2

¿Qué tal -Wunused-label?

+3

nop, pero su respuesta equivocada me llevó a la correcta: D –

42

Solución para GCC no causar conflictos con otros compiladores

#ifdef __GNUC__ 
#define VARIABLE_IS_NOT_USED __attribute__ ((unused)) 
#else 
#define VARIABLE_IS_NOT_USED 
#endif 

int VARIABLE_IS_NOT_USED your_variable; 
+1

eso es exactamente lo que también se ha hecho en la fuente de gcc para argumentos de funciones no utilizadas. +1 :) –

+2

Encontré que usar ____tribuir____ ((____unused____)) funciona para GCC 4.x.x – mtasic85

3

Esto es difícil de responder sin conocer los detalles de sus macros aserciones estáticas. ¿Tal vez podría cambiar a una macro diferente para evitar este problema? Puede agregar el atributo 'no utilizado' a la macro como se sugirió, o puede usar una forma diferente de CASSERT().

Éstos son descripciones de algunas alternativas:

http://www.jaggersoft.com/pubs/CVu11_3.html

http://blog.kowalczyk.info/kb/compile-time-asserts-in-c.html

http://www.pixelbeat.org/programming/gcc/static_assert.html

28

Se puede crear una instrucción nula y arrojó el resultado de anular. Esto es portátil entre los compiladores, y gcc no le dará ninguna advertencia, incluso con -Wall y -Wextra habilitados. Por ejemplo:

int var; // var is not used 
(void)var; // null statement, cast to void -- suppresses warning 

Una técnica común es crear una macro para esto:

#define UNUSED(x) ((void)(x)) 

int var; 
UNUSED(var); 
+1

Curiosamente, todavía recibo advertencias. Por ejemplo, cuando llamo a system() y no me importa la devolución: '(void) system (cmd.c_str());' No entiendo por qué esto debería generar una advertencia. – BobDoolittle

+0

@BobDoolittle: Huh, eso es interesante, no he visto ese comportamiento antes. ¿Qué compilador y qué versión de ese compilador estás usando? –

+0

gcc 4.8.2 en Ubuntu 14.04. Estoy compilando toda mi fuente con -Wunused-result, y estoy buscando una manera de suprimir explícitamente la advertencia para aquellos lugares donde se verifica que el comportamiento es correcto. Siempre he utilizado un molde para (vacío) para eso en el pasado, pero no para trabajar aquí. – BobDoolittle

89

acabamos de ver este tema durante la búsqueda de soluciones a este problema. He puesto aquí para completar la solución que encontré ...

Las banderas del compilador GCC que el control sin usar warnings incluyen:

-Wunused-function 
-Wunused-label 
-Wunused-parameter 
-Wunused-value 
-Wunused-variable 
-Wunused (=all of the above) 

Cada una de ellas tiene una forma negativa que corresponde con "no-" insertado después de la W que desactiva la advertencia (en caso de que haya sido activado por -Wall, por ejemplo). De este modo, en su caso, se debe utilizar

-Wno-unused-function 

Por supuesto, esto funciona para todo el código, no sólo en tiempo de compilación afirma. Para un comportamiento específico de la función, eche un vistazo a Function attributes.

+0

¿Se puede establecer esto por archivo? – Danijel

25

Esta es una de las advertencias más molestas, aunque entiendo que puede ser útil (a veces) para verificar el código muerto. Pero generalmente tengo funciones estáticas para la depuración, o funciones que pueden ser útiles en el futuro, o que solo se usan temporalmente, y quiero mantenerlas en el código.

Afortunadamente, esta advertencia no se preocupa por las funciones en línea.

inline static foo() 
{ 
} 
+3

en línea es solo la solución que necesitaba, gracias. –

+0

Trabaja como una cosa encantadora ... ACTUALIZADO – NSPratik

+1

Entonces, ¿por qué no envuelves esas funciones en las directivas de preprocesador? P.ej. '#ifdef UNIT_TEST static foo()'? – Mawg

4
#define UNUSED_VAR  __attribute__ ((unused)) 

para cualquier variable sólo tiene que utilizar la macro anterior antes de su tipo, por ejemplo:

UNUSED_VAR int a = 2; 
+1

Hemos adoptado esto para nuestro proyecto. PERO, solo para los casos en que el compilador se equivoca en sus advertencias. Por ejemplo, tenemos algunas variables a las que solo se accede con el puntero, por lo que el compilador cree que no se utilizan. Es aceptable suprimir las advertencias al respecto, pero las variables verdaderamente no utilizadas deben eliminarse de nuestro código. – Mawg

Cuestiones relacionadas