2008-10-10 6 views
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.¿Cómo manejar un conflicto de nombre de clase al portar código antiguo?

He intentado utilizar una directiva, es decir, utilizando :: TObject;

Pero eso no lo hace.

La solución obvia es envolver toda la biblioteca original en un espacio de nombres y luego llamarla 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.

Respuesta

0

Si usted tiene la fuente de la biblioteca, tal vez incluir un archivo de cabecera en la parte superior de cada fuente en el archivo de cabecera tiene solamente:

#define TObject TMadeUpNameObject 
0

Prueba esto:

namespace oldlib 
{ 
    #inclcude "oldlib.h" 
}; 
+0

Esto hará que el compilador cree símbolos con el prefijo oldlib, que no estará presente en la biblioteca anterior, lo que dará como resultado el símbolo 'símbolo externo no resuelto': __thiscall oldlib :: A :: void ("void)" (? ? 1A @ oldlib @@ QAE @ XZ) ' – xtofl

1

Usted podría crear un contenedor para todas las funciones antiguas y empaquetarlas en una biblioteca DLL o estática.

0

He utilizado el siguiente en el pasado, mientras que encapsula un archivo de cabecera de terceros que contengan clases en colisión con el código:

#ifdef Symbol 
#undef Symbol 
#define Symbol ThirdPartySymbol 
#endif 
#include <third_party_header.h> 
#undef Symbol 

De esta manera, "símbolo" en la cabecera fue precedido de Terceros y esto no era colisionando con mi código.

3

Puede hacer lo que sugirió Dib, 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 #DEFINE la exclusión de sólo los archivos en las que obtiene conflictos, y utilizar todos los símbolos como símbolos globales de otra manera.

Cuestiones relacionadas