es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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>

Tags:  , ,

Answer

  1. Avatar for 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 modificar main.cpp de la siguiente manera:

    // main.cpp
    #include <third_party2.h>
    
    // Suprimir advertencia sobre inicializadores designados en la macro FOO
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wc++20-designator"
    int main() 
    {
        Foo f = FOO;
        return f.x;
    }
    #pragma clang diagnostic pop
    

    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 macro FOO.

    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>

Comments are closed.