¿Cómo suprimir las advertencias de GCC de los encabezados de la biblioteca?


Tengo un proyecto que usa log4cxx, boost, etc. bibliotecas cuyos encabezados generan muchas advertencias (repetitivas). ¿Hay una manera de suprimir las advertencias de la biblioteca includes (es decir, #include ) o incluye desde ciertos caminos? Me gustaría usar-Wall y / o-Wextra como de costumbre en el código del proyecto sin oscurecer la información relevante. Actualmente uso grep en hacer salida, pero me gustaría algo mejor.

Author: AdSR, 2009-12-08

8 answers

Puede intentar incluir encabezados de biblioteca usando -isystem en lugar de -I. Esto los convertirá en" encabezados del sistema " y GCC no reportará advertencias para ellos.

 101
Author: Phi,
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
2011-09-19 13:56:47

Para aquellos que usan CMake, puede modificar sus directivas include_directories para incluir el símbolo SYSTEM que suprime las advertencias contra tales encabezados.

include_directories(SYSTEM "${LIB_DIR}/Include")
                    ^^^^^^
 78
Author: Drew Noakes,
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-10 10:54:47

Puedes usar pragmas. Por ejemplo:

// save diagnostic state
#pragma GCC diagnostic push 

// turn off the specific warning. Can also use "-Wall"
#pragma GCC diagnostic ignored "-Wunused-but-set-variable"

#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/lexical_cast.hpp>

// turn the warnings back on
#pragma GCC diagnostic pop
 40
Author: andrewrjones,
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-04-06 17:16:55

Encontré el truco. Para la biblioteca includes, en lugar de -Idir use -isystem dir en el makefile. GCC luego trata boost, etc. como sistema incluye e ignora cualquier advertencia de ellos.

 23
Author: AdSR,
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
2009-12-14 10:39:34

#pragma son instrucciones para el compilador. puedes establecer algo antes del # include y deshabilitarlo después.

También puede hacerlo en la línea de comandos .

Otra página de GCC específicamente en deshabilitando las advertencias.

Optaría por la opción de usar #pragma dentro del código fuente, y luego proporcionar un sonido razón (como un comentario) de por qué está deshabilitando las advertencias. Esto significaría un razonamiento sobre los archivos de encabezados.

CCG se acerca a esto mediante clasificando los tipos de advertencia. Puede clasificarlos para que sean advertencias o para que se ignoren. Los artículos previamente enlazados le mostrarán qué advertencias se pueden desactivar.

Nota: también puede masajear el código fuente para evitar ciertas advertencias utilizando atributos; sin embargo, esto lo vincula bastante estrechamente con GCC.

Note2: GCC también usa la interfaz pop/push como se usa en el compilador de Microsoft Microsoft Microsoft desactiva las advertencias a través de este interfaz. Le sugiero que investigue esto más a fondo, ya que no sé si es posible.

 8
Author: Hassan Syed,
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
2009-12-08 15:00:33

Puede intentar usar encabezados precompilados. Las advertencias no desaparecerán, pero al menos no aparecerán en tu compilación principal.

 4
Author: Pablo Santa Cruz,
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
2009-12-08 13:46:05

Si necesita anular explícitamente un encabezado del sistema, entonces está restringido a pragmas. Puede verificar qué incluye que está utilizando a través de make depend salida.

Ver también push-pop de diagnóstico para gcc >= 4.6

 0
Author: supaflav,
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 12:34:48

Estas advertencias deben estar motivadas. Éstos serán causados por errores en el código que utiliza la biblioteca, o por errores en el código de la biblioteca en sí. En el primer caso, arregla tu código. En el segundo caso, deje de usar la biblioteca o si es código FOSS, arréglela.

 -6
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
2009-12-08 13:48:43