5 Stimmen

Wie geht man mit einem Klassennamenkonflikt um, wenn man alten Code portiert?

Ich versuche, eine alte Bibliothek (die keine Namespaces verwendet, soweit ich das beurteilen kann) auf moderne Compiler zu portieren. Eines meiner Ziele kann den Unterschied zwischen System::TObject und ::TObject (ohne Namespace) nicht erkennen. System::TObject ist dem Compiler eigen.

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

Aber das reicht nicht aus.

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 vernünftigste Lösung? Gibt es eine andere Lösung? Das Hinzufügen eines Namensraums würde die Änderung einer Reihe von Dateien erfordern, und ich weiß nicht, ob dies später unerwünschte Auswirkungen haben würde.

3voto

Nick Punkte 6782

Sie können wie von Dib vorgeschlagen vorgehen, allerdings mit einer kleinen Änderung:

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

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

#ifndef DONT_AUTO_INCLUDE_OLD_NAMESPACE
using namespace oldlib;
#endif

Dies ermöglicht es Ihnen, den Ausschluss nur in den Dateien zu definieren, in denen es zu Konflikten kommt, und ansonsten alle Symbole als globale Symbole zu verwenden.

1voto

Adam Pierce Punkte 32051

Sie könnten einen Wrapper für alle alten Funktionen erstellen und sie in einer DLL oder statischen Bibliothek zusammenfassen.

0voto

Jim Buck Punkte 19904

Wenn Sie den Quelltext der Bibliothek haben, sollten Sie vielleicht eine Header-Datei am Anfang jedes Quelltextes einfügen, in der nur diese Header-Datei enthalten ist:

#define TObject TMadeUpNameObject

0voto

John Dibling Punkte 96619

Versuchen Sie dies:

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

0voto

David Segonds Punkte 80975

Ich habe in der Vergangenheit das Folgende verwendet, während ich eine Header-Datei eines Drittanbieters gekapselt habe, die Klassen enthält, die mit dem Code kollidieren:

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

Auf diese Weise wurde "Symbol" in der Kopfzeile von ThirdParty vorangestellt, und dies kollidierte nicht mit meinem Code.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X