¿Cómo desactiva las advertencias de variables no utilizadas que salen de gcc en el código de terceros que no deseo editar?


Me gustaría saber qué interruptor pasa al compilador gcc para desactivar las advertencias de variables no utilizadas? Estoy recibiendo errores de boost en Windows y no quiero tocar el código boost:

C:\boost_1_52_0/boost/system/error_code.hpp: At global scope:
C:\boost_1_52_0/boost/system/error_code.hpp:214:36: error: 'boost::system::posix_category' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:215:36: error: 'boost::system::errno_ecat' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:216:36: error: 'boost::system::native_ecat' defined but not used [-Werror=unused-variable]

Traté de usar ambos -Wunused-value y -Wno-unused-value pero ninguno suprimió los mensajes anteriores.

Cuál es el comando correcto, aquí está mi línea de compilación:

g++  -g -fno-inline -Wall -Werror -Wextra -Wfloat-equal -Wshadow
-Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wno-conversion 
-Wdisabled-optimization -Wredundant-decls -Wunused-value -Wno-deprecated 
-IC:\\boost_1_52_0 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 
-c -o op.o op.cpp

Tal vez el -Wall anula mi objetivo?

Author: WilliamKF, 2013-02-24

9 answers

El interruptor -Wno-unused-variable generalmente hace el truco. Sin embargo, esa es una advertencia muy útil si te preocupas por estas cosas en tu proyecto. Sin embargo, se vuelve molesto cuando GCC comienza a advertirte sobre cosas que no están en tu código.

Le recomendaría mantener la advertencia activada, pero use -isystem en lugar de -I para incluir directorios de proyectos de terceros. Esa bandera le dice a GCC que no te advierta sobre las cosas sobre las que no tienes control.

Por ejemplo, en lugar de -IC:\\boost_1_52_0, digamos -isystem C:\\boost_1_52_0.

Espero que ayude. ¡Buena suerte!

 199
Author: ,
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-02-24 16:31:09

A veces solo necesita suprimir solo algunas advertencias y desea mantener otras advertencias, solo para estar seguro. En su código, puede suprimir las advertencias para variables e incluso parámetros formales utilizando el atributo unused de GCC. Digamos que tienes este fragmento de código:

void func(unsigned number, const int version)
{
  unsigned tmp;
  std::cout << number << std::endl;
}

Puede haber una situación en la que necesite usar esta función como manejador, lo cual (en mi humilde opinión) es bastante común en la biblioteca Boost de C++. Luego necesita el segundo parámetro formal version , por lo que el la firma de la función es la misma que la plantilla que requiere el controlador, de lo contrario la compilación fallaría. Pero realmente no lo necesita en la función en sí tampoco...

La solución para marcar la variable o el parámetro formal a excluir de las advertencias es la siguiente:

void func(unsigned number, const int version __attribute__((unused)))
{
  unsigned tmp __attribute__((unused));
  std::cout << number << std::endl;
}

GCC tiene muchos otros parámetros, puede comprobarlos en las páginas de manual . Esto también funciona para los programas de C, no solo C++, y creo que se puede utilizar en casi todas las funciones, no solo los controladores. ¡Adelante, inténtalo! ;)

P.d.: Últimamente he usado esto para suprimir las advertencias de serialización de Potenciadores en plantillas como esta:

template <typename Archive>
void serialize(Archive &ar, const unsigned int version __attribute__((unused)))

EDITAR: Aparentemente, no respondí tu pregunta como necesitabas, drak0sha lo hizo mejor. Es porque he seguido el título de la pregunta, mi mal. Con suerte, esto podría ayudar a otras personas, que llegan aquí debido a ese título... :)

 63
Author: Dee'Kej,
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-23 11:54:50

Si está usando gcc y desea deshabilitar la advertencia para el código seleccionado, puede usar la directiva del compilador # pragma:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
( your problematic library includes )
#pragma GCC diagnostic pop

Para el código que controle, también puede usar __attribute__((unused)) para indicar al compilador que no se utilizan variables específicas.

 57
Author: Ole Wolf,
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
2014-10-21 16:56:12

Véase man gcc bajo Opciones de Advertencia. Ahí tienes un montón de unused

Opciones de advertencia
... -Wunused-Wunused-function-Wunused-label-Wunused-parameter-Wunused-value-Wunused-variable-Wunused-but-set-parameter-Wunused-but-set-variable

Si antepones cualquiera de ellos con no-, desactivará esta advertencia.

Muchas opciones tienen nombres largos que comienzan con-f o con-W - - - por ejemplo,-fmove-loop-invariants, - Wformat y así en. La mayoría de estos tienen formas positivas y negativas; la forma negativa de-ffoo sería-fno-foo. Este manual documenta solo uno de estos dos formularios, el que no sea el predeterminado.

Se puede encontrar una explicación más detallada en Opciones para Solicitar o Suprimir Advertencias

 14
Author: Olaf Dietsche,
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-01-12 13:35:21

Use -Wno-unused-variable debería funcionar.

 9
Author: Mats Petersson,
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-02-24 16:31:32

El compilador ya te está diciendo, no es value sino variable. Estás buscando -Wno-unused-variable. También, intente g++ --help=warnings para ver una lista de opciones disponibles.

 3
Author: Daniel Frey,
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-02-24 16:28:13

¿Cómo se deshabilitan las advertencias de variables no utilizadas que salen de gcc?
Estoy obteniendo errores de boost en Windows y no quiero tocar el código boost...

Visita Trac de Boost y envía un informe de error contra Boost.

Su aplicación no es responsable de borrar las advertencias y errores de la biblioteca. La biblioteca es responsable de borrar sus propias advertencias y errores.

 1
Author: jww,
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-07-26 19:52:00

Retire el -Wall y debería funcionar. El problema con la eliminación de -Wall es que también suprimirá las advertencias legítimas. Tendrías que elegir a mano las opciones -W en este caso o cambiar a -Wno-unused-variable una vez que tengas todas las advertencias cubiertas.

LOCAL_CFLAGS = -Wno-unused-variable -g
 -3
Author: Michele,
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-05-28 22:44:50
export IGNORE_WARNINGS=1

Muestra advertencias, pero continúa con la compilación

 -3
Author: Sifiso Myeni,
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-10-14 09:56:08