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

94

Me gustaría saber qué conmutador pasa al compilador gcc para desactivar las advertencias de variables no utilizadas. Recibo errores de boost en Windows y no quiero tocar el código de 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]

Intenté usar ambos -Wunused-valuey, -Wno-unused-valuepero 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

¿Quizás el -Wallanula mi objetivo?

WilliamKF
fuente
Como dice el mensaje de error más o menos, intente-Werror=no-unused-variable
Joachim Isaksson

Respuestas:

237

El -Wno-unused-variableinterruptor suele hacer el truco. Sin embargo, esa es una advertencia muy útil si se preocupan por estas cosas en su proyecto. Sin embargo, se vuelve molesto cuando GCC comienza a advertirle sobre cosas que no están en su código.

Le recomendaría que mantenga activada la advertencia, pero use en -isystemlugar de -Iincluir directorios de proyectos de terceros. Esa bandera le dice a GCC que no le advierta sobre las cosas sobre las que no tiene control.

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

Espero eso ayude. ¡Buena suerte!


fuente
¿Dónde agregar esta configuración? Lo hice en "Configuración del proyecto / Compilador AVR GNU C / Varios", pero será ignorado (la ruta es correcta, aún recibe advertencias) Al agregar eso a la configuración del Directorio (desmarque la casilla de verificación de la ruta relativa) AtmelStudio fallará.
hfrmobile
3
también tenemos -Wno-unused-parameterpara los parámetros de función no utilizados, -Wno-unused-functionpara la función no utilizada
Ngo Thanh Nhan
1
Necesitas:-Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable
Ronny Sherer
82

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 de variables e incluso parámetros formales utilizando el atributo no utilizado de GCC . Supongamos que tiene 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 controlador, que (en mi humilde opinión) es bastante común en la biblioteca C ++ Boost. Luego, necesita la segunda versión de parámetro formal , por lo que 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 tampoco lo necesitas en la función en sí ...

La solución de cómo marcar la variable o el parámetro formal que se excluirá de las advertencias es esta:

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 consultarlos en las páginas de manual . Esto también funciona para los programas C, no solo C ++, y creo que se puede usar en casi todas las funciones, no solo en los controladores. ¡Sigue adelante e inténtalo! ;)

PD: Últimamente usé esto para suprimir las advertencias de la serialización de Boosts en una plantilla 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 seguí principalmente el título de la pregunta, mi mal. Con suerte, esto podría ayudar a otras personas, que llegan aquí por ese título ... :)

Dee'Kej
fuente
7
Para los parámetros formales, puede omitir el nombre, por ejemplo void func(unsigned number, const int). Entonces, gcc tampoco se quejará de que no se use version.
Olaf Dietsche
@OlafDietsche Creo que esto depende de la gccversión que estés usando. IIRC, tuve que usarlo hace 4 años, para suprimir las advertencias sobre no usado version. ;)
Dee'Kej
66

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 controlas, también puedes usarlo __attribute__((unused))para indicarle al compilador que no se usan variables específicas.

Ole Wolf
fuente
En general, diría que usar directivas #pragma no es muy seguro, a menos que realmente sepa lo que está haciendo, o esté usando, por ejemplo, OpenMP para la paralelización ...;)
Dee'Kej
1
Las #pragmadirectivas @ Dee'Kej son perfectamente seguras si las envuelve en #ifdef some_compiler ... #endif. Las advertencias son una característica específica del compilador y no están definidas por el estándar. No puede suprimir ninguna advertencia del código sin #pragmas.
Kotauskas
@ vladislav-toncharov Tiene razón en que las advertencias son específicas del compilador. Pero no estamos hablando de advertencias del compilador en general aquí, estamos hablando específicamente de GCC. También tienes razón en que #pragma no es dañino por decirlo. Sin embargo, en mi opinión, muchas personas no saben cómo usar correctamente #pragma, y ​​por eso lo considero "peligroso" (por la falta de mejores palabras).
Dee'Kej
15

Consulte la man gccsección Opciones de advertencia. Ahí tienes un montón deunused

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

Si antepone a alguno de ellos no-, desactivará esta advertencia.

Muchas opciones tienen nombres largos que comienzan con -fo con -W --- por ejemplo, -fmove-loop-invariants, -Wformat y así sucesivamente. La mayoría de estos tienen formas tanto positivas como 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.

Puede encontrar una explicación más detallada en Opciones para solicitar o suprimir advertencias

Olaf Dietsche
fuente
No sabía que puedo prefijar "no-" con cualquier advertencia.
ARN
10

El uso -Wno-unused-variabledebería funcionar.

Mats Petersson
fuente
¡Ahh, variable no utilizada, no valor no utilizado!
WilliamKF
5
O -Wno-error=unused-variablesi desea eliminar el error y mantener la advertencia.
Oskar N.
1
De hecho, puede ver cuál es la advertencia real [-Werror=unused-variable].
Mats Petersson
3

El compilador ya te lo está diciendo, no es valuepero variable. Que busca -Wno-unused-variable. Además, intente g++ --help=warningsver una lista de opciones disponibles.

Daniel Frey
fuente
3

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

Visita Boost's Trac y presenta 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.

jww
fuente
0

-Wally -Wextraestablece el escenario en GCC y lo siguiente -Wno-unused-variablepuede no tener efecto. Por ejemplo, si tiene:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -Wall -Wextra \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ -Wno-unused-parameter \ -Wno-unused-variable \ $(INC)

entonces GCC ve la instrucción -Wall -Wextra y parece ignorar-Wno-unused-variable

En cambio, esto puede verse así a continuación y obtendrá el efecto deseado de no ser detenido en su compilación en la variable no utilizada:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ $(INC)

Hay una buena razón por la que se denomina "advertencia" frente a "error". Fallar en la compilación solo porque su código no está completo (digamos que está eliminando el algoritmo) puede ser frustrante.

William Cerniuk
fuente
-3
export IGNORE_WARNINGS=1

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

Sifiso Myeni
fuente