¿Cómo 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 /*...*/ alrededor de los parámetros. Pero no en C, por supuesto, donde me da el error error: parameter name omitted.

11 answers

Normalmente escribo una macro como esta:

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

Puede usar esta macro para todos sus parámetros no utilizados. (Tenga en cuenta que esto funciona en cualquier compilador.)

Por ejemplo:

void f(int x) {
    UNUSED(x);
    ...
}
 243
Author: Job,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-20 08:20:24

En gcc, puede etiquetar el parámetro con el unused atributo .

Este atributo, unido a una variable, significa que la variable es destinado a ser posiblemente no utilizado. GCC no producirá una advertencia para esto variable.

En la práctica esto se logra poniendo __attribute__ ((unused)) justo después del parámetro. Por ejemplo

auto lambda = [](workerid_t workerId) -> void { };

Se convierte en

auto lambda = [](__attribute__((unused)) _workerid_t workerId) -> void { } ;
 78
Author: Flow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-15 19:05:25

Puede usar el atributo no utilizado de gcc/clang, sin embargo, uso estas macros en un encabezado para evitar tener atributos específicos de gcc en toda la fuente, también tener __attribute__ en todas partes es un poco prolijo/feo.

#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 hacerlo...

void foo(int UNUSED(bar)) { ... }

Prefiero esto porque obtienes un error si intentas usar bar en el código en cualquier lugar para que no puedas dejar el atributo por error.

Y para funciones...

static void UNUSED_FUNCTION(foo)(int bar) { ... }

Nota 1):
Hasta ahora como sé, MSVC no tiene un equivalente a __attribute__((__unused__)).

Nota 2):
La macro UNUSED no funcionará para argumentos que contengan paréntesis,
así que si tienes un argumento como float (*coords)[3] no puedes hacer,
float UNUSED((*coords)[3]) o float (*UNUSED(coords))[3], Este es el único inconveniente de la macro UNUSED que he encontrado hasta ahora, en estos casos caigo de nuevo a (void)coords;

 54
Author: ideasman42,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-29 01:57:39

Con gcc con el atributo no utilizado:

int foo (__attribute__((unused)) int bar) {
    return 0;
}
 16
Author: Teddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-20 13:09:57

Etiquetar el atributo es la manera ideal. MACRO conduce a la confusión en algún momento. y al usar void (x), estamos agregando una sobrecarga en el procesamiento.

Si no usa el argumento de entrada, use

void foo(int __attribute__((unused))key)
{
}

Si no se utiliza la variable definida dentro de la función

void foo(int key)
{
   int hash = 0;
   int bkt __attribute__((unused)) = 0;

   api_call(x, hash, bkt);
}

Ahora más tarde usando la variable hash para su lógica, pero no necesita bkt. define bkt como no utilizado, de lo contrario el compilador dice bkt set bt not used".

NOTA: Esto es solo para suprimir la advertencia, no para la optimización.

 4
Author: user2452561,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-04 18:32:48

Una forma específica de gcc/g++ para suprimir la advertencia de parámetro no utilizado para un bloque de código fuente es encerrarlo con las siguientes instrucciones pragma:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
<code with unused parameters here>
#pragma GCC diagnostic pop
 4
Author: Calm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-26 22:18:04

Tengo el mismo problema. Usé una biblioteca de tercera parte. Cuando compilo esta biblioteca, el compilador (gcc/clang) se quejará de las variables no utilizadas.

Así

Prueba.cpp: 29: 11: advertencia: variable 'mágica' establecida pero no utilizada [-Wunused-but-set-variable] magia corta [] = {

Prueba.cpp: 84: 17: advertencia: variable no utilizada 'before_write' [-Wunused-variable] int64_t before_write = Thread:: currentTimeMillis ();

Así que la solución es bastante claro. Agregar -Wno-unused como gcc/clang CFLAG suprimirá todas las advertencias "no utilizadas", incluso aunque tenga -Wall establecido.

De esta manera, NO NECESITA cambiar ningún código.

 3
Author: landerlyoung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-26 07:04:50

En MSVC para suprimir una advertencia en particular es suficiente especificar el número a compilarse como /wd#. Mis listas de fabricantes.txt contiene tal bloque:

If (MSVC)
    Set (CMAKE_EXE_LINKER_FLAGS "$ {CMAKE_EXE_LINKER_FLAGS} / NODEFAULTLIB: LIBCMT")
    Add_definitions (/W4 /wd4512 /wd4702 /wd4100 /wd4510 /wd4355 /wd4127)
    Add_definitions (/D_CRT_SECURE_NO_WARNINGS)
Elseif (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUC)
    Add_definitions (-Wall -W -pedantic)
Else ()
    Message ("Unknown compiler")
Endif ()

Ahora no puedo decir qué significa exactamente /wd4512 /wd4702 /wd4100 /wd4510 /wd4355 /wd4127, porque no presto atención a MSVC durante tres años, pero suprimen las advertencias superpedánticas que no influyen en el resultado.

 1
Author: Bwana The Master,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-16 14:06:12

He visto que se usa este estilo:

if (when || who || format || data || len);
 1
Author: Iustin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-26 14:48:39

Viendo que esto está marcado como gcc, puede usar el interruptor de línea de comandos Wno-unused-parameter.

Por ejemplo:

gcc -Wno-unused-parameter test.c

Por supuesto, esto afecta a todo el archivo (y tal vez al proyecto, dependiendo de dónde configure el interruptor), pero no tiene que cambiar ningún código.

 1
Author: Paul Hutchinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-04 13:38:40

Para el registro, me gusta la respuesta de Job anterior, pero tengo curiosidad por una solución que solo use el nombre de la variable por sí misma en una declaración de "no hacer nada":

void foo(int x) {
    x; /* unused */
    ...
}

Claro, esto tiene inconvenientes; por ejemplo, sin la nota "no utilizada" parece un error en lugar de una línea de código intencional.

El beneficio es que no se necesita DEFINIR y se deshace de la advertencia.

¿ Hay alguna diferencia de rendimiento, optimización u otras?

 0
Author: Dr. Person Person II,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-25 05:39:49