Ist es möglich, eine C++ Bibliothek in C einzubinden?
Wie könnte ich das machen?
Gibt es bereits vorhandene Tools?
(Ich muss auf eine bestehende C++ Bibliothek zugreifen, aber nur mit C)
Ist es möglich, eine C++ Bibliothek in C einzubinden?
Wie könnte ich das machen?
Gibt es bereits vorhandene Tools?
(Ich muss auf eine bestehende C++ Bibliothek zugreifen, aber nur mit C)
Sie können objektorientierten Code in C schreiben, daher ist es möglich, eine objektorientierte C++-Bibliothek in einer C-Schnittstelle zu verpacken. Dies kann jedoch sehr mühsam sein, insbesondere wenn Sie Vererbung, virtuelle Funktionen und ähnliche Dinge unterstützen müssen.
Wenn die C++-Bibliothek generische Programmierung (Vorlagen) verwendet, kann es wirklich knifflig werden (Sie müssten alle benötigten Instanzen einer Vorlage bereitstellen) und nähert sich schnell dem Punkt, an dem es sich einfach nicht lohnt.
Angenommen, es ist OO, hier ist eine grundlegende Skizze, wie Sie OO in C machen können:
C++-Klasse:
Klasse cpp {
public:
cpp(int i);
void f();
};
C-Schnittstelle:
#ifdef __cplusplus
extern "C" {
#endif
typedef void* c_handle;
c_handle c_create(int i)
{
return new cpp(i);
}
void c_f(c_handle hdl)
{
static_cast(hdl)->f();
}
void c_destroy(c_handle hdl)
{
delete static_cast(hdl);
}
#ifdef __cplusplus
}
#endif
Je nach Ihren Anforderungen könnten Sie das anpassen. Wenn dies zum Beispiel eine öffentliche C-Schnittstelle zu einer privaten C++-API werden soll, könnten echte Zeiger als Griffe es angreifbar machen. In diesem Fall würden Sie Griffe ausgeben, die im Wesentlichen Ganzzahlen sind, die Zeiger in einer Griff-zu-Zeiger-Karte speichern und den Cast durch eine Suche ersetzen.
Das Zurückgeben von Zeichenfolgen und anderen dynamisch dimensionierten Ressourcen kann auch ziemlich aufwändig werden. Sie müssten dem C-Aufrufer den Puffer bereitstellen, aber er kann die Größe im Voraus nicht kennen. Einige APIs (wie Teile der Win32-API) erlauben es dann dem Aufrufer, eine solche Funktion mit einem Puffer der Länge 0 aufzurufen, in dem Fall geben sie die erforderliche Pufferlänge zurück. Dies zu tun kann jedoch die Aufrufe über die API furchtbar ineffizient machen. (Wenn Sie die Länge des erforderlichen Puffers erst nach Ausführung des Algorithmus kennen, muss er zweimal ausgeführt werden.)
Eine Sache, die ich in der Vergangenheit gemacht habe, ist, Griffe (ähnlich dem Griff im obigen Code) an intern gespeicherte Zeichenfolgen zu übergeben und eine API bereitzustellen, um die erforderliche Puffergröße abzufragen, die Zeichenfolge mit dem Puffer abzurufen und den Griff zu zerstören (was die intern gespeicherte Zeichenfolge löscht).
Das ist wirklich mühsam zu verwenden, aber so ist C.
(nicht "extern c")
extern C hilft Ihnen nur dabei, Namen in DLLs so zu haben, wie Sie sie sehen.
Sie können verwenden
dumpbin /EXPORTS your.dll
um zu sehen, was mit Namen passiert, ob mit extern C oder ohne.
http://msdn.microsoft.com/en-us/library/c1h23y6c(v=vs.71).aspx
Um Ihre Frage zu beantworten... Es hängt davon ab... Aber es ist sehr unwahrscheinlich, dass Sie es ohne Umschließungen verwenden können. Wenn diese C++-Bibliothek nur einfache Funktionen und Typen verwendet, können Sie sie einfach verwenden. Wenn diese C++-Bibliothek eine komplexe Klassenstruktur verwendet - wahrscheinlich werden Sie sie ohne Umschließung nicht verwenden können. Das liegt daran, dass die internen Klassen je nach vielen Bedingungen strukturiert sein können (Verwendung von Vererbung mit virtuellen Tabellen oder Abstraktion. Oder zum Beispiel kann eine komplexe C++-Bibliothek eigene Mechanismen zur Objekterstellung haben, sodass Sie sie so verwenden MÜSSEN, wie sie entworfen ist, oder Sie erhalten unberechenbares Verhalten).
Also, ich denke, Sie müssen sich darauf vorbereiten, einige Umschließungen zu machen.
Und hier ist ein guter Artikel über das Umschließen von C++-Klassen. In dem Artikel erzählt der Autor, wie man C++-Klassen in C# umschließt, aber er verwendet zuerst C.
http://www.codeproject.com/KB/cs/marshalCPPclass.aspx
Wenn die C++-Bibliothek geschrieben wird, die mit einem C-Compiler mit leichten Bearbeitungen kompiliert werden kann (z.B. Ändern von bool
in int
, false
in 0
und true
in 1
usw.), dann kann das gemacht werden.
Aber nicht jeder C++-Code kann in C eingebettet werden. Das Template ist ein Feature in C++, das nicht eingebettet werden kann, oder es ist fast unmöglich.
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.