Mit C++ Bibliothek in C-code
Ich habe eine C++ - Bibliothek, stellt verschiedene Klassen zur Verwaltung von Daten. Ich habe den Quellcode für die Bibliothek.
Möchte ich erweitern die C++ - API zur Unterstützung von C-Funktionsaufrufen so, dass sich die Bibliothek kann mit C-code und C++ - code zur gleichen Zeit.
Ich bin mit der GNU-toolchain (gcc, glibc usw.), also Sprache und Architektur-Unterstützung sind nicht ein Problem.
Gibt es irgendwelche Gründe, warum dies technisch nicht möglich?
Gibt es gotcha ist muss ich achten?
Gibt es Ressourcen, Beispiel-code und/oder Dokumentation in Bezug auf diese?
Einige andere Dinge, die ich herausgefunden habe:
- Folgenden verwenden, wickeln Sie Ihre C++ - Header, die verwendet werden müssen, die von C-code.
#ifdef __cplusplus
extern "C" {
#endif
//
//Code goes here ...
//
#ifdef __cplusplus
} //extern "C"
#endif
- Halten "echte" C++ - interfaces in separate header-Dateien, die nicht Bestandteil von C. Denke PIMPL Prinzip hier. Mit
#ifndef __cplusplus #error
Zeug hilft hier zu erkennen, keine Verrücktheit. - Vorsichtig von C++ - Bezeichner als Namen in C-code
- Enumerationen, die unterschiedlich in der Größe zwischen C-und C++ - Compiler. Wahrscheinlich kein Problem wenn Sie mit GNU tool chain, aber dennoch vorsichtig sein.
-
Für Strukturen befolgen Sie das folgende Formular, damit C nicht verwirrt.
typedef struct X { ... } X
-
Dann verwenden Sie die Zeiger für die Weitergabe um C++ - Objekte, Sie müssen nur deklariert werden, die in C als struct X, wobei X die C++ - Objekt.
All dies ist mit freundlicher Genehmigung von einem Freund, der ist ein Zauberer C++.
- Etwas spät, aber ich schrieb ein kleines howto über C-wrapper für C++: teddy.ch/c++_library_in_c
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, das ist sicherlich möglich. Sie müssen schreiben Sie eine interface-Schicht in C++, in der Sie deklariert Funktionen mit
extern "C"
:Dann werden Sie rufen
foo()
von der C-Modul weiter, der den Aufruf auf derrealFoo()
Funktion, die in C++ implementiert.Wenn Sie benötigen, um setzen eine vollständige C++ - Klasse mit Daten-member und-Methoden, dann müssen Sie möglicherweise mehr Arbeit zu tun als diese einfache Funktion Beispiel.
extern "C"
nur in Deklarationen (und nicht in Definitionen)? Weil Sie erwähnt "die Ebene, in der Sie deklariert Funktionen" aber dein Beispielcode ist auch eine definition. In anderen Worten, sollten wir es in header-Dateien oder Quellcode-Dateien?(oder beide?)extern "C"
es. Ihr compiler wird Ihnen sagen, wenn Sie auch legen Sie es auf die definition an.C++ FAQ Lite: "Wie mischen von C-und C++ - code".
Einige Fallstricke beschrieben werden, in der Antworten auf diese Fragen:
Wichtigsten Punkt: exceptions können nicht abgefangen werden, C. Wenn es die Möglichkeit gibt eine Ausnahme, steigt Sie in die C++ - code, entweder schreiben Sie Ihre C-code oder C++ - Wrapper sehr sorgfältig. Umgekehrt, Ausnahme wie Mechanismen (d.h., longjump) in den C-code (wie in verschiedenen Script-Sprachen) sind nicht erforderlich zum aufrufen von Destruktoren für C++ - Objekte auf den stack.
können Sie mix C/C++ - code. Wenn Sie Ihre main () - Funktion in C++, dann müssen Sie nur sicherstellen, dass Ihre c-Funktionen deklariert sind,
Wenn Ihr Haupt ist C, dann sind Sie wahrscheinlich in Ordnung, außer für statische Variablen. Alle Konstruktoren mit statischen Variablen sollen aufgerufen werden, bevor main() starten. Dies wird nicht passieren, wenn C ist Ihr Haupt. Ich Sie haben eine Menge von statischen Variablen, das beste, was zu tun ist, ersetzen Sie statischen Variablen mit singletons.