¿Cómo puedo suprimir las advertencias de "parámetros no utilizados" en C?
Por ejemplo:
Bool NullFunc(const struct timespec *when, const char *who)
{
return TRUE;
}
En C++ pude poner un /*...*/
comentario sobre los parámetros. Pero no en C claro, donde me da el error:
error: nombre del parámetro omitido
Normalmente escribo una macro como esta:
#define UNUSED(x) (void)(x)
Puede utilizar esta macro para todos los parámetros no utilizados. (Tenga en cuenta que esto funciona en cualquier compilador).
Por ejemplo:
void f(int x) {
UNUSED(x);
...
}
En GCC, puede etiquetar el parámetro con el unused
atributo .
Este atributo, adjunto a una variable, significa que la variable posiblemente no se utilice. GCC no producirá una advertencia para esta variable.
En la práctica, esto se logra poniendo __attribute__ ((unused))
justo antes del parámetro. Por ejemplo:
void foo(workerid_t workerId) { }
se convierte
void foo(__attribute__((unused)) workerid_t workerId) { }
Puede utilizar el atributo no utilizado de GCC o Clang . Sin embargo, uso estas macros en un encabezado para evitar tener atributos específicos de GCC en toda la fuente, además tenerlos en todas partes es un poco detallado/feo.__attribute__
#ifdef __GNUC__
# define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
#else
# define UNUSED(x) UNUSED_ ## x
#endif
#ifdef __GNUC__
# define UNUSED_FUNCTION(x) __attribute__((__unused__)) UNUSED_ ## x
#else
# define UNUSED_FUNCTION(x) UNUSED_ ## x
#endif
Entonces puedes hacer...
void foo(int UNUSED(bar)) { ... }
Prefiero esto porque obtienes un error si intentas usarlo bar
en el código en cualquier lugar, por lo que no puedes dejar el atributo por error.
Y para funciones...
static void UNUSED_FUNCTION(foo)(int bar) { ... }
Nota 1):
Hasta donde yo sé, MSVC no tiene un equivalente a __attribute__((__unused__))
.
Nota 2):
La UNUSED
macro no funcionará con argumentos que contengan paréntesis,
por lo que si tiene un argumento como este , nofloat (*coords)[3]
puede hacerlo o . Este es el único inconveniente de la macro que encontré hasta ahora, y en estos casos recurro a .
float UNUSED((*coords)[3])
float (*UNUSED(coords))[3]
UNUSED
(void)coords;