2010-12-03 5 views
5

Ich modifiziere ein großes C++ - Projekt, das in einem seiner Hauptheader eine enum FooBar definiert. Dieses Enum wird überall aufgenommen, und leider ist kein Namespace.Ist es möglich, einen C++ - Namespace zu allen Symbolen aus einer C-Bibliothek hinzuzufügen?

Von diesem Projekt möchte ich eine C-Bibliothek verwenden, die leider auch eine enum FooBar im selben globalen Namespace definiert.

Ich kann die Bibliotheksimplementierung nicht ändern, und es ist schwierig, die Enumeration im C++ - Projekt umzubenennen oder zu benennen, da sie überall verwendet wird.

Also idealerweise würde ich einen Namensraum zu allen Symbolen aus der C-Bibliothek hinzufügen. Ich habe so etwas wie versucht:

namespace c_library_foo { 
#include <c_library_foo.h> 
} 

... 
c_library_foo::c_library_function() 
... 

und das funktioniert gut bis Kompilation betrifft, aber natürlich der Linker versagt dann die Symbole aus der Bibliothek zu lösen, wie der Namespace nicht in der Umsetzung ist.

Antwort

2

Nein. Die Unterstützung von Namespaces in C++ erfordert eine Namensänderung. Die von der C-Bibliothek ausgegebenen Symbole sind nicht umbenannt (was in C nicht passiert). Sie müssen die C++ - Enumeration lieber als die C enum umbenennen.

4

Nun, ich fand die Lösung etwa 2s nach dem Posten. Durch das Hinzufügen von externem "C" wird der Namespace beim Auflösen der Symbole gelöscht und mein Problem behoben. Etwas wie:

namespace c_library_foo { 
extern "C" { 
#include <c_library_foo.h> 
} 
} 

... 
c_library_foo::c_library_function() 
... 
+0

Mit Ausnahme jetzt Ihr Programm wird fehlschlagen zu verknüpfen (Oder vielmehr, zeigt undefiniertes Verhalten). –

+1

@Billy: Dies ist nicht undefiniert. Dies ist genau das, was C++ in die C-Header einfügt. Wenn Sie einschließen, dann können Sie std :: memcmp() einfach in Ordnung bringen. –

+0

@Zan: Weil C++ definiert, dass die Funktion da sein soll. Nur weil es auf * Ihrer * Plattform funktioniert, bedeutet das nicht, dass es die eine Definitionsregel nicht bricht. –

Verwandte Themen