Me gustaría deshabilitar advertencias particulares para todos los archivos que se incluyen, directa o indirectamente, por archivos de inclusión en particular. Por ejemplo, quiero desactivar la advertencia "estás asignando un literal de cadena a un carácter *", para todos los archivos o archivos incluidos por archivos incluidos por a #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 literal de cadena en particular. Me gustaría ignorar esos miles de advertencias que provienen de su código, para poder concentrarme en los errores en mi propio código y corregirlos.
Utilizo Intel C ++ y GCC. Algunos de mis amigos usan clang, por lo que también me alegraría escuchar soluciones para eso.
fuente
<bar/the_file.h>
, las advertencias deben suprimirse, ¿y<the_file.h>
no?Respuestas:
Al usar GCC, puede usar la
-isystem
bandera en lugar de la-I
bandera para deshabilitar las advertencias de esa ubicación.Entonces, si está usando actualmente
utilizar
en lugar. Desafortunadamente, este no es un control particularmente detallado. No conozco un mecanismo más específico.
fuente
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
fuente
Cuando uso
g++
y tengo encabezados de terceros que generan toneladas de advertencias con mis valores predeterminados habituales de-Wall -Wextra
& co. Tiendo a agruparlos en inclusiones separadas, especificando el .system_header
#pragma
Prefiero esta solución a la anterior
-isystem
porque es más detallada y puedo ponerla directamente en las fuentes, sin jugar demasiado con los argumentos de la línea de comandos y los directorios de inclusión.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
fuente
Supongo que la solución más simple sería escribir un script simple que llame al compilador, compile y elimine la salida no deseada, según el nombre del archivo y el tipo de advertencia. Puede utilizar diferentes scripts para cada compilador.
Simplemente actualice su archivo MAKE para usar este script en lugar de llamar directamente al compilador.
fuente