8

Estoy trabajando en un proyecto C++ (usando g++), en el que estamos usando librerías externas en C.

Por este motivo, el compilador emite multitud de warnings:

warning: use of old-style cast [-Wold-style-cast]

El problema es sencillo: los archivos de cabecera del código C usan el casting propio del lenguaje: (void *)myVar( NULL );

Como he dicho, son de una librería externa y no quiero tocarlos, so pena de tener que realizar un muy gran trabajo manual, y repetirlo cada vez que actualicemos la versión de la librería.

¿ Hay alguna forma de eliminar esos warnings solo para uno o varios archivos de cabecera ?

Marc
  • 5,005
  • 7
  • 17
  • 36
Trauma
  • 25,297
  • 4
  • 37
  • 60

2 Answers2

7

Después de unas cuantas búsquedas, encontré la solución:

g++ warning on old-style-cast (C casts) with a legacy C header having macros

Usando g++, podemos usar #pragma:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wold-style-cast"
#include "archivo_cabecera_c.h"
#pragma GCC diagnostic pop

El código anterior:

  1. Guarda el estado actual de la generación de avisos.
  2. Deshabilita los avisos old-style cast (convirtiendose en el estado actual).
  3. Incluye el archivo de cabecera problemático.
  4. Restaura el estado previo: vuelve a activar la generación de avisos.

No estamos limitados a 1 solo #include, sino que podemos colocar varios.

Es necesario colocar el código anterior en todos los archivos .cpp que usen las cabeceras problemáticas.

Como uso adicional, no estamos limitados solo a esos warnings:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wold-style-cast"
#pragma GCC diagnostic ignored "-Wunused-variable"
#include "archivo_cabecera_c.h"
#pragma GCC diagnostic pop

Ahí, además de lo anterior, eliminamos los avisos sobre variables sin usar.

Trauma
  • 25,297
  • 4
  • 37
  • 60
7

¿ Hay alguna forma de eliminar esos warnings solo para uno o varios archivos de cabecera ?

«Al César lo que es del César y a Dios lo que es de Dios».

— Jesús de Nazaret — Mateo 22:20.


C++ y C son lenguajes distintos con convenciones distintas, normas distintas, estándares distintos e incluso distintas palabras clave. Son dos mundos que no deberían mezclarse (por eso, si se necesita una cabecera de C en C++ se debe usar la versión adaptada).

Usar convenciones de C en C++ provoca en muchos casos una alarma y así debe ser. Eliminar dicha alarma puede ser contraproducente y propenso a errores, esas alarmas están ahí por un buen motivo ¿Qué pasa si eliminas esa alarma (y te olvidas de reactivarla) y alguien usa esas conversiones? ¡Pues que esa injuria pasará desapercibida!

Por suerte (o por desgracia) C y C++ están estrechamente relacionados y muchas veces se considera necesario usar librearías de C en C++ (al revés es casi imposible), por eso se permite marcar bloques de código como si perteneciesen a C:

extern "C"
{
#include "Cabecera_de_c.h"
}

Todo el código incluido en el bloque extern "C" será tratado como C con sus convenciones, normas y palabras clave. Puedes dejar las alarmas activadas.

Esta herramienta, añade además una clara semántica al bloque: Eso pertenece a otro lenguaje, lo cuál puede ser de utilidad para otros programadores que examinen el código.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82