¿Cómo puedo suprimir las advertencias de "parámetros no utilizados" en C?

Resuelto nixgadget asked hace 14 años • 14 respuestas

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

nixgadget avatar Aug 30 '10 16:08 nixgadget
Aceptado

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);
    ...
}
mtvec avatar Aug 30 '2010 09:08 mtvec

En GCC, puede etiquetar el parámetro con el unusedatributo .

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) { }
Peter Mortensen avatar Aug 30 '2010 09:08 Peter Mortensen

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 baren 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 UNUSEDmacro 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;

ideasman42 avatar Oct 15 '2012 07:10 ideasman42