¿Cómo ignorar las advertencias del compilador para macros definidas en encabezados de terceros?
Actualmente es posible indicar al compilador que ignore las advertencias de un encabezado específico considerándolo un “encabezado del sistema”, incluyendo el encabezado mediante -isystem /ruta/a/directorio
.
Sin embargo, esto aún no funcionará si la advertencia proviene de una macro definida en dicho encabezado. ¿Existe alguna forma de ignorar las advertencias también para las macros? Estoy principalmente interesado en soluciones para GCC y Clang.
Los ejemplos a continuación se basan en Clang 14.0.0 y GCC 11.1.0 en Ubuntu 20.04:
// include/third_party.h
#pragma once
#define MY_CAST(x) ((int)x)
// main.cpp
#include <third_party.h>
int main()
{
int x = MY_CAST(123);
return x;
}
Con GCC:
$ g++ -isystem include -Wold-style-cast main.cpp
In file included from main.cpp:1:
main.cpp: In function ‘int main()’:
main.cpp:5:21: warning: use of old-style cast to ‘int’ [-Wold-style-cast]
5 | int x = MY_CAST(123);
| ^~~
Con Clang:
$ clang++ -isystem include -Wold-style-cast main.cpp
$
Ejemplo que funciona con GCC pero no con Clang:
// include/third_party2.h
#pragma once
struct Foo
{
int x;
int y;
};
#define FOO Foo{.x = 123, .y = 321}
// main.cpp
#include <third_party2.h>
int main()
{
Foo f = FOO;
return f.x;
}
$ g++ -isystem include -pedantic main2.cpp
$
“`
$ clang++ -isystem include -pedantic main2.cpp
main2.cpp:5:13: warning: designated initializers are a C++20 extension [-Wc++20-designator]
Foo f = FOO;
^
include/third_party2.h:9:17: note: expanded from macro 'FOO'
#define FOO Foo{.x = 123, .y = 321}
^
1 warning generated.
“`</third_party2.h></third_party.h>
davy.ai
Ignorando advertencias para macros en compiladores de C++
Cuando se incluyen encabezados mediante
-isystem
en GCC y Clang, es posible ignorar las advertencias de los archivos de encabezado utilizando__attribute__((system_header))
en el archivo de encabezado o mediante la opción de línea de comando-Wsystem-headers
para GCC. Sin embargo, esto puede no ser suficiente si la advertencia proviene de una macro definida en el archivo de encabezado.Desafortunadamente, no existe una forma directa de ignorar las advertencias para macros en GCC y Clang. Una posible solución alternativa es redefinir la macro con una definición actualizada, pero esto puede no siempre ser factible o práctico.
Otra opción es usar
#pragma GCC diagnostic ignored "-Wnombre-de-advertencia"
(para GCC) o#pragma clang diagnostic ignored "-Wnombre-de-advertencia"
(para Clang) para suprimir las advertencias para secciones específicas de código, incluyendo aquellas que involucran macros.Por ejemplo, en el segundo fragmento de código anterior, Clang genera una advertencia sobre el uso de inicializadores designados en la macro
FOO
debido a que es una extensión de C++20. Para suprimir esta advertencia, podemos modificarmain.cpp
de la siguiente manera:Esto utiliza las directivas
#pragma clang diagnostic push
y#pragma clang diagnostic pop
para suprimir temporalmente la advertencia para la sección de código donde se utiliza la macroFOO
.De manera similar, podemos usar
#pragma GCC diagnostic push/pop
en su lugar para GCC.Se debe tener en cuenta que esta no es una solución ideal, ya que requiere modificar el código fuente y puede suprimir otras advertencias que no están relacionadas con la macro en cuestión. Sin embargo, hasta que se disponga de una mejor solución, puede ser útil en ciertas situaciones.</third_party2.h>