compilador - ¿Cuál es la mejor manera de suprimir la "variable no utilizada x"?
gcc wikipedia (11)
No le dé un nombre a la variable (C ++)
void foo(int /*bar*/) {
...
}
Dígale a su compilador usando un mecanismo no estándar específico del compilador
Vea respuestas individuales para __attribute__((unused))
, varios #pragma
s y así sucesivamente. Opcionalmente, envuelva una macro de preprocesador para portabilidad.
Desactivar la advertencia
Los IDE pueden señalar visualmente las variables no utilizadas (color diferente o subrayado). Teniendo eso, la advertencia del compilador puede ser bastante inútil.
En GCC y Clang, agregue la opción -Wno-unused-parameter
al final de la línea de comando (después de todas las opciones que activan la advertencia de parámetros no utilizados, como -Wall
, -Wextra
).
Agrega un yeso al vacío
void foo(int bar) {
(void)bar;
}
según la respuesta de jamesdlin y http://herbsutter.com/2009/10/18/mailbag-shutting-up-compiler-warnings/
¿Cuál es la mejor / la mejor forma de suprimir un compilador (en este caso, gcc) como "no utilizado variable x"?
No quiero dar ningún indicador determinado a gcc para eliminar todas estas advertencias, solo para casos especiales.
Asignarlo a sí mismo.
void f(int unused) {
unused = unused;
}
Funciona en gcc, pero las necesidades de clang no se autoasignan.
Edit: ahora creo que casting to void es la solución más portátil: tanto gcc como clang lo entienden, incluso con advertencias completas -W{all,extra,pedantic}
:
(void)unused;
El lanzamiento a un vacío es el mejor enfoque porque muestra que no guardó "accidentalmente" la variable en su código, es decir: esta función podría ser una instancia en la que tiene una tabla de indicadores de función que necesitan los mismos tipos de parámetros y tipos de devolución, pero en esta entrada de tabla particular no está utilizando el parámetro.
Dicho eso, si no lo necesitas, deshazte de él. ;)
Elimine la declaración de variable no utilizada del código. (Juego de palabras intencionado)
(¿Qué? Es lo que hago: señale que lo más probable es la mejor solución).
Ahora, a partir de los comentarios sobre otras respuestas, aparentemente es basura generada a partir de macros. Bueno, eso es un pleonasmo.
Soluciones:
- refactorizar esa macro a # si declara la variable solo si realmente se usa;
- crear otra versión de la macro que omita la generación de variables no utilizadas.
- Mejor aún, evite el uso de macros que traen problemas al código.
Encontré un artículo http://sourcefrog.net/weblog/software/languages/C/unused.html que explica UNUSED. Es interesante que el autor también destruya el nombre de la variable no utilizada para que no pueda usarla inadvertidamente en el futuro.
Extracto:
#ifdef UNUSED
#elif defined(__GNUC__)
# define UNUSED(x) UNUSED_ ## x __attribute__((unused))
#elif defined(__LCLINT__)
# define UNUSED(x) /*@unused@*/ x
#else
# define UNUSED(x) x
#endif
void dcc_mon_siginfo_handler(int UNUSED(whatsig))
Es una solución muy hackish, pero ¿intentó simplemente asignarle la variable a sí mismo? Creo que eso debería engañar a la mayoría de los compiladores para que piensen que se usa la variable. Debería ser bastante portátil también.
Puede silenciar la advertencia con #pragma
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused"
int unususedVariable = 1;
#pragma clang diagnostic pop
Si está utilizando GCC, use #pragma gcc ...
Si esto es realmente lo que quiere, puede usar el atributo no utilizado (solo gcc), algo así como:
void foo(int __attribute__((__unused__)) bar) {
...
}
No solo para los parámetros de función, por supuesto, pero ese es el caso de uso más común, ya que podría ser una función de devolución de llamada para una API en la que realmente no necesita toda la información.
Además, GLib tiene una macro G_GNUC_UNUSED que creo que se expande a ese atributo.
Si se usa y está enviando el proyecto, elimínelo. Peor comentario.
#pragma unused <variable>
(void) variable
podría funcionar para algunos compiladores.
Para el código C ++, también vea http://herbsutter.com/2009/10/18/mailbag-shutting-up-compiler-warnings/ donde Herb Sutter recomienda el uso:
template<class T> void ignore( const T& ) { }
...
ignore(variable);