¿La mejor manera de suprimir la advertencia de C “Variable x no utilizada”? [duplicate]

6 minutos de lectura

avatar de usuario de gustaf
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.

  • 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

avatar de usuario de jamesdlin
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 #pragmay 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

Avatar de usuario de Edward Leno
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

Avatar de usuario de Cascabel
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.

Avatar de usuario de James Webster
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

avatar de usuario de nmichaels
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

Avatar de usuario de Mike Stroven
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


¿Ha sido útil esta solución?