gustavo
¿Cuál es la forma mejor/más ordenada de suprimir un compilador de C (por ejemplo, GCC) como la advertencia “Variable x no utilizada”?
La documentación de GCC explica
-Wunused-variable
Avisar cada vez que una variable local o una variable estática no constante no se utilice aparte de su declaración
No quiero dar ningún indicador determinado a mi compilador para eliminar todas estas advertencias, solo para casos especiales.
jamesdlin
(void) variable
podría funcionar para algunos compiladores.
Para el código C++, consulte también Bolsa de correo: cerrando las advertencias del compilador donde Herb Sutter recomienda usar:
template<class T> void ignore( const T& ) { }
...
ignore(variable);
-
Esto funciona en gcc 4.7.1 con
-std=c99
– Wayne Conrado
2 mayo 2013 a las 16:59
-
Y también funciona en VS.
– AndersK
17 dic 2013 a las 20:54
-
(void) no funciona con nvcc 7.5 con gcc 4.9.2 y C++11 habilitado. El enlace herbsutter con
template<class T> void ignore( const T& ) { }
¡Funciona genial!– Ax3l
21 de enero de 2016 a las 16:21
-
La pregunta original está etiquetada como C, no como C++. Por lo que sé, la var (vacío) funciona en todos los principales compiladores de C.
– Calmarius
18 de marzo de 2016 a las 13:46
-
(void) variable
es genial porque funciona para cualquier variable no utilizada, no solo para parámetros de función como con la respuesta aceptada.– vgru
11 de julio de 2017 a las 10:37
Dígale a su compilador usando un mecanismo no estándar específico del compilador
Ver respuestas individuales para __attribute__((unused))
varios #pragma
y así sucesivamente. Opcionalmente, envuelva una macro de preprocesador a su alrededor para la portabilidad.
Apague la advertencia
Los IDE pueden señalar variables no utilizadas visualmente (diferente color o subrayado). Teniendo eso, la advertencia del compilador puede ser bastante inútil.
En GCC y Clang, agregue -Wno-unused-parameter
opción 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
).
Agregar un molde para anular
void foo(int bar) {
(void)bar;
}
Según la respuesta de jamesdlin y Bolsa de correo: cerrando las advertencias del compilador.
No asigne un nombre a la variable (solo C23 y C++)
No permitido en C antes del estándar C23, pero con un compilador más reciente (en 2023) y en C++ (desde siempre) se puede hacer
void foo(int /*bar*/) {
...
}
Ver el N2480 Permitir parámetros sin nombre en una definición de función (pdf) propuesta, y verifique el estado de implementación en https://en.cppreference.com/w/c/compiler_support
GCC 11, Clang 11 e ICX 2022.2 (oneAPI 2022.3) lo admiten.
-
No puedo creer que comentarlo funcione. Ese es el camino a seguir si está usando C++ y es compatible.
–Ross Rogers
19 mayo 2016 a las 16:23
eduardo leno
Encontré un artículo, http://sourcefrog.net/weblog/software/languages/C/unused.htmleso explica NO USADO. Es interesante que el autor también altere el nombre de la variable no utilizada, por lo que no puede 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))
-
… otra macro de encabezado de solo escritura es justo lo que necesitamos para eliminar una advertencia bastante benigna.
– jpinto3912
5 de agosto de 2010 a las 21:24
-
Estoy contigo. Mi código contiene
static const char cvsid[] = "$Id$";
. Eso es corto, dulce y legible, pero gcc -Wall arroja un tambaleo. No quiero tener que escribir todo este código impenetrable solo para suprimir ese error.–Edward Falk
26 mayo 2016 a las 19:27
-
El enlace está roto: “Error: no encontrado. La URL solicitada /weblog/software/languages/C/unused.html no se encontró en este servidor”.
-Peter Mortensen
14 de noviembre de 2021 a las 23:04
-
Re “NO USADO”: ¿No querrás decir no usado (la cosita del CCG)?
-Peter Mortensen
14 de noviembre de 2021 a las 23:06
-
En cualquier caso, ¿puede vincular a la documentación? (Pero sin “Editar:”, “Actualizar:” o similar; la respuesta debería aparecer como si hubiera sido escrita hoy).
-Peter Mortensen
14 de noviembre de 2021 a las 23:26
cascabel
Si esto es realmente lo que quieres, puedes usar el no usado atributo (solo GCC), algo como:
void foo(int __attribute__((__unused__)) bar) {
...
}
No solo para los parámetros de la 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 en realidad no necesita toda la entrada.
Además, Fácil tiene una macro G_GNUC_UNUSED que creo que se expande a ese atributo.
James Webster
Puede silenciar la advertencia usando #pragma
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused"
int unususedVariable = 1;
#pragma clang diagnostic pop
Si está utilizando GCC, utilice #pragma gcc ...
-
Tal vez la última línea debería ser
#pragma clang diagnostic pop
– Jason Lee
15 de septiembre de 2014 a las 3:49
-
#pragma GCC ...
(quiere mayúsculas GCC)– Evgen
10 de febrero de 2017 a las 20:49
nmichaels
#pragma unused <variable>
-
Tal vez la última línea debería ser
#pragma clang diagnostic pop
– Jason Lee
15 de septiembre de 2014 a las 3:49
-
#pragma GCC ...
(quiere mayúsculas GCC)– Evgen
10 de febrero de 2017 a las 20:49
mike stroven
La conversión a un vacío es el mejor enfoque porque muestra que no mantuvo “accidentalmente” la variable en su código, es decir: esta función podría ser una instancia en la que tiene una tabla de punteros de función que necesitan los mismos tipos de parámetros y tipos de retorno, pero en esta entrada de tabla en particular no está utilizando el parámetro.
Dicho esto, si no lo necesitas, deshazte de él. 😉
-
¿Puede agregar un ejemplo (que realmente compile (con alguna versión específica de uno o más compiladores específicos))? (Pero sin “Editar:”, “Actualizar:” o similar; la respuesta debería aparecer como si hubiera sido escrita hoy).
-Peter Mortensen
14 de noviembre de 2021 a las 23:15
Hay razones legítimas para hacer esto, por ejemplo, tomar el desarrollo de complementos para un sistema, que espera su función con una firma específica como
void function_name(int par1, char *par2);
y solo necesitas trabajar en par2.– Residuo
7 de febrero de 2012 a las 17:04
En ese caso, escriba la firma como
void function_name(int par1, char*);
lo cual es perfectamente válido y no generará advertencias.– Frank Kusters
18 de febrero de 2013 a las 13:52
@spaceknarf Si hago eso con gcc 4.7.2 obtengo
error: parameter name omitted
.– craig65535
23 de febrero de 2013 a las 1:18
No creo que sea válido dejar un parámetro sin nombre en la firma de una función C cuando es parte de la definición. Sin embargo, es aceptable en C++.
– davidA
28/09/2016 a las 20:11