c++ - ¿Cómo deshabilitar las advertencias para archivos de inclusión particulares?
suppress-warnings (4)
Me gustaría deshabilitar advertencias particulares para todos los archivos que están incluidos, directa o indirectamente, por determinados archivos de inclusión. Por ejemplo, quiero desactivar la advertencia "está asignando un literal de cadena a un char *", para todos los archivos o archivos incluidos por los archivos incluidos por un #include <bar/*>
(la estrella en mi caso significa "cualquier cosa puede estar aquí").
La razón es que algunas de las personas con las que tengo que programar simplemente no pueden usar "const", así que al final recibo muchas advertencias sobre ese abuso de cadenas en particular. Me gustaría ignorar las miles de advertencias que provienen de su código, para poder concentrarme en los errores de mi propio código y solucionarlos.
Uso Intel C ++ y GCC. Algunos de mis amigos usan clang, por lo que me gustaría escuchar soluciones para eso también.
Cuando use GCC, puede usar el indicador -isystem
lugar del indicador -I
para deshabilitar las advertencias de esa ubicación.
Entonces, si estás usando actualmente
gcc -Iparent/path/of/bar …
utilizar
gcc -isystem parent/path/of/bar …
en lugar. Desafortunadamente, este no es un control particularmente detallado. No estoy al tanto de un mecanismo más específico.
Cuando uso g++
y tengo encabezados de terceros que generan toneladas de advertencias con mis valores predeterminados habituales de -Wall -Wextra
& co. system_header
separadas, especificando el system_header
#pragma
.
[...] GCC da el código encontrado en los encabezados del sistema un tratamiento especial. Todas las advertencias, distintas de las generadas por
#warning
(consulte Diagnóstico), se suprimen mientras GCC procesa un encabezado del sistema. Las macros definidas en un encabezado de sistema son inmunes a algunas advertencias donde sea que se expandan. Esta inmunidad se concede de forma ad-hoc, cuando descubrimos que una advertencia genera muchos falsos positivos debido al código en las macros definidas en los encabezados del sistema.[...]
También hay una directiva,
#pragma GCC system_header
, que le dice a GCC que considere el resto del archivo de inclusión actual como un encabezado de sistema, sin importar dónde se encontró. El código que viene antes del#pragma
en el archivo no se verá afectado.#pragma GCC system_header
no tiene ningún efecto en el archivo de origen primario.
Prefiero esta solución al -isystem
uno porque es más preciso y puedo ponerlo directamente en las fuentes, sin jugar demasiado con los argumentos de la línea de comandos e incluir directorios.
Ejemplo con la horrible biblioteca raíz:
#ifndef ROOTHEADERS_HPP_INCLUDED
#define ROOTHEADERS_HPP_INCLUDED
#ifdef __GNUC__
// Avoid tons of warnings with root code
#pragma GCC system_header
#endif
#include "TH1F.h"
#include "TApplication.h"
#include "TGraph.h"
#include "TGraph2D.h"
#include "TCanvas.h"
#endif
Supongo que la solución más simple sería escribir un script simple que llamará al compilador, compilará y pegará el resultado no deseado, según el nombre del archivo y el tipo de advertencia. Puede usar diferentes scripts para cada compilador.
Simplemente actualice su archivo MAKE para usar este script en lugar de llamar al compilador directamente.
Una mejor solución de GCC: use #pragma.
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-W<evil-option>"
#include <evil_file>
#pragma GCC diagnostic pop
por ejemplo:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
#include <QtXmlPatterns>
#pragma GCC diagnostic pop