2008-10-10 4 views
5

Ich versuche, eine alte Bibliothek (die Namespaces nicht verwendet, soweit ich sagen kann) zu modernen Compilern zu portieren. Eines meiner Ziele kann den Unterschied zwischen System :: TObject und :: TObject (ohne Namespace) nicht erkennen. System :: TObject ist systemeigen für den Compiler.Wie behandelt man einen Klassennamenkonflikt, wenn alter Code portiert wird?

Ich habe eine using-Direktive versucht, d.h. mit :: TObject;

Aber das tut es nicht.

Die offensichtliche Lösung besteht darin, die gesamte ursprüngliche Bibliothek in einen Namespace zu packen und sie dann namentlich aufzurufen - das sollte die Mehrdeutigkeit vermeiden. Aber ist das die klügste Lösung? Gibt es eine andere Lösung? Wenn Sie einen Namespace hinzufügen, müssen Sie einige Dateien ändern, und ich weiß nicht, ob dies später unerwünschte Auswirkungen haben würde.

Antwort

0

Wenn Sie die Quelle in die Bibliothek haben, sind vielleicht eine Header-Datei an der Spitze von jeder Quelle, wo die Header-Datei nur hat:

#define TObject TMadeUpNameObject 
0

Try this:

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

Dies wird dazu führen, dass der Compiler Symbole mit dem Präfix oldlib erzeugt, die in der alten Bibliothek nicht vorhanden sind, was zu einem "unaufgelösten externen Symbol" public führt: __thiscall oldlib :: A :: ~ A (void) "(? ? 1A @ oldlib @@ QAE @ XZ) ' – xtofl

1

Sie könnten Erstellen Sie einen Wrapper für alle alten Funktionen und packen Sie diese in eine DLL oder eine statische Bibliothek.

0

Ich habe folgend in der Vergangenheit verwendet, während eine dritte Partei Header-Datei Einkapseln Klassen enthält, mit dem Code zu kollidieren:

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

diese Weise „Symbol“ in der Kopfzeile wurde durch Drittanbieter als Präfix und das war nicht kollidiert mit meinem Code.

3

Sie können tun, als Dib vorgeschlagen, mit einer geringfügigen Änderung:

// In a wrapper header, eg: include_oldlib.h... 

namespace oldlib 
{ 
    #include "oldlib.h" 
}; 

#ifndef DONT_AUTO_INCLUDE_OLD_NAMESPACE 
using namespace oldlib; 
#endif 

Diese nur in den Dateien den Ausschluss #define erlaubt, wo man Konflikte sind immer, und alle Symbole als globale Symbole verwenden Andernfalls.