In Konflikt stehende Deklarationen auflösen
-
Hallo,
ich habe zwei Projekte jeweils in eine Library kompiliert und würde nun gerne quasi eine main.cpp schreiben, die die Funktionalität der zwei Hauptklassen der Libraries testet. Beide Projekte enthalten allerdings beispielsweise C-Funktionen mit dem gleichen Namen. Wenn ich also in meiner main.cpp die Header-Dateien der beiden Klassen einbinde, erhalte ich die Meldung, dass diverse Deklarationen in Konflikt zueinander stehen.
Gibt es irgendeine Möglichkeit so etwas zu umgehen?
LG, mike.
-
namespaces
-
korrekt und für Variablen / Instanzen / Konstanten bietet sich eine "extern"-Deklaration an.
-
Inwiefern habe ich mir das denn vorzustellen? Also wo soll ich die Namespaces einführen? Ich habe es mit folgendem in der main versucht:
namespace x1 { #include "x1.hpp" } namespace x2 { #include "x2.hpp" } x1::Class1* dev1 = new x1::Class1(); x2::Class2* dev2 = new x2::Class2();Das hat nicht hingehauen, weil er sich dann beschwert, dass die Funktionen nicht implementiert wurden.
PS: Ich kann höchstens in der main oder in den Hauptklassen etwas verändern. An allen weiteren Dateien kann nichts verändert werden!
-
#includeist reine Textersetzung, du kannst das nicht so verwenden.Für dein Problem solltest du nicht beide Dateien gleichzeitig inkludieren, sondern jede jeweils in eine .cpp-Datei. Dafür schreibst du dir Adapter, deren Schnittstelle du in zwei .hpp-Dateien anbietest. Diese beiden Header kannst du nun in der Main.cpp verwenden...
-
Er meinte, dass Du Deine Teilprojekte in Namespaces steckst.
Dann können die Bezeichner von Funktionen und Variablen auch identisch sein.
Man erzwingt hier unterschiedliche Pfade durch Namensräume.
Der Bezeichner einer Variablen besteht implizit nicht nur aus dem Bezeichner, sondern auch aus dem vorangestellten Namensraum.Gibst Du keinen an, wird der globale verwendet.
Hast Du nun durch zwei Teilprojekte eine Funktion oder Variable mit dem selben Bezeichner und arbeist nicht mit Namespaces, dann werden beide jeweils im globalen Namensraum erzeugt, was nicht geht. Hierfür müsste man dann schon mit extern- und static-Deklarationen arbeiten. Oder Du legst Deine Teilprojekte komplett, so wie sie sind in zwei verschiedene Namensräume...
-
Das Problem ist halt, dass beide Projekte generierten Code enthalten auf den ich keinen Einfluss habe. Ich kann also nicht einfach vor jede Funktionsdeklaration den Namensraumbezeichner schreiben.
Ich verstehe auch nicht, wie Nexus' Lösung helfen soll. Im Endeffekt inkludiere ich doch trotzdem alle Funktionen. Zwar nicht direkt, aber nach dem x-ten eingebetetten Include schon.
-
mikemodanoxxx schrieb:
Ich verstehe auch nicht, wie Nexus' Lösung helfen soll. Im Endeffekt inkludiere ich doch trotzdem alle Funktionen. Zwar nicht direkt, aber nach dem x-ten eingebetetten Include schon.
Nein. Etwas ausführlicher:
Du hast die Dateien First.hpp und Second.hpp mit gleichen Funktionsnamen gegeben, an ihnen kannst du nichts ändern.
Nun schreibst du 2 Dateien FirstAdapter.cpp und SecondAdapter.cpp, die First.hpp und Second.hpp einbinden. Die Symbole sind also lokal in der .cpp-Datei. Nun schreibst du dir hier entsprechende Adapter, deren Schnittstelle du in FirstAdapter.hpp und SecondAdapter.hpp anbietest.
Main.cpp inkludiert nun die Header FirstAdapter.hpp und SecondAdapter.hpp. Nichts vom originalen Code ist in Main.cpp sichtbar.
-
Ok ich verstehe was du meinst. Ich verhindere quasi, dass die Methoden, die sich überschneiden, gemeinsam inkludiert werden.
Folgendes Szenario liegt hier konkret vor: Ich habe eine (sehr große) Klasse, die einen bestimmten Datentyp benutzt. Der Datentyp steht in einer Datei, die zu diesen Mehrdeutigkeiten führt. Wenn ich das Problem jetzt also umgehen möchte, muss ich mir eine neue Klasse schreiben, die den Zugriff auf die große Klasse kapselt und dadurch verhindert, dass von außen diese "gefährliche" Datei eingebunden wird. Es ist also eine ganze Menge Arbeit damit verbunden weil die Klassen so groß sind. Ist das die einzige Möglichkeit? Falls ja muss ich mir doch mal eine Alternative überlegen..