c++ - segun - ¿Cómo manejar un conflicto de nombre de clase al portar código viejo?
manejo de conflictos laborales (5)
Estoy tratando de portar una biblioteca antigua (que no usa espacios de nombres por lo que puedo ver) a los compiladores modernos. Uno de mis objetivos no puede distinguir entre System :: TObject y :: TObject (sin un espacio de nombres). System :: TObject es nativo del compilador.
He intentado usar una directiva, es decir, usando :: TObject;
Pero eso no lo hace.
La solución obvia es envolver toda la biblioteca original en un espacio de nombres y luego llamarlo por nombre, lo que debería evitar la ambigüedad. ¿Pero es esa la solución más sabia? hay alguna otra solucion? Agregar un espacio de nombres requeriría cambiar un montón de archivos y no sé si tendría repercusiones no deseadas más adelante.
He utilizado lo siguiente en el pasado al encapsular un archivo de encabezado de un tercero que contiene clases que colisionan con el código:
#ifdef Symbol
#undef Symbol
#define Symbol ThirdPartySymbol
#endif
#include <third_party_header.h>
#undef Symbol
De esta forma, "ThirdParty" marcó el prefijo "Symbol" en el encabezado y esto no colisionó con mi código.
Puedes hacer lo que Dib sugirió, con una ligera modificación:
// In a wrapper header, eg: include_oldlib.h...
namespace oldlib
{
#include "oldlib.h"
};
#ifndef DONT_AUTO_INCLUDE_OLD_NAMESPACE
using namespace oldlib;
#endif
Esto le permite # definir la exclusión solo en los archivos donde está obteniendo conflictos, y usar todos los símbolos como símbolos globales de lo contrario.
Podría hacer un contenedor para todas las funciones anteriores y empaquetarlas en una biblioteca DLL o estática.
Prueba esto:
namespace oldlib
{
#inclcude "oldlib.h"
};
Si tiene el origen de la biblioteca, tal vez incluya un archivo de encabezado en la parte superior de cada fuente donde ese archivo de encabezado solo tenga:
#define TObject TMadeUpNameObject