Frage

Ich habe eine C ++ Bibliothek, die für die Verwaltung von Daten, die verschiedene Klassen zur Verfügung stellt. Ich habe den Quellcode für die Bibliothek.

Ich mag die C ++ API erweitert C-Funktion aufruft, so dass die Bibliothek zu unterstützen, kann mit C-Code und C ++ Code zur gleichen Zeit verwendet werden.

Ich bin mit GNU-Toolchain (gcc, glibc, etc.), so Sprache und Architektur Unterstützung ist kein Thema.

Gibt es irgendwelche Gründe, warum dies technisch nicht möglich?

Gibt es Gotcha ist , dass ich achten?

Gibt es Ressourcen, Beispielcode und / oder Dokumentation dieser Verfügung in Bezug auf?


Einige andere Dinge, die ich herausgefunden haben:

  1. Verwenden Sie die folgende C ++ Header zu wickeln, die von C-Code verwendet werden müssen.

#ifdef __cplusplus
extern "C" {  
#endif  
//  
// Code goes here ...  
//  
#ifdef __cplusplus  
} // extern "C"  
#endif
  1. Halten "real" C ++ Schnittstellen in separaten Header-Dateien, die durch C. nicht enthalten sind Denken Sie PIMPL Prinzip hier. Mit #ifndef __cplusplus #error Sachen hier hilft jede Verrücktheit zu erkennen.
  2. Sorgfältige von C ++ Bezeichner als Name in C-Code
  3. Aufzählungen unterschiedliche Größe zwischen C und C ++ Compiler. Wahrscheinlich kein Problem, wenn Sie GNU-Toolkette verwenden, aber immer noch, vorsichtig sein.
  4. Für structs das folgende Formular folgen, so dass C nicht verwirrt werden.

    typedef struct X { ... } X
    
  5. Verwenden Sie dann Zeiger zum Weiterleiten um C ++ Objekte, sie müssen nur in C als struct X deklariert werden, wobei X das Objekt C ++ ist.

All dies ist mit freundlicher Genehmigung von einem Freund, der ein Assistent in C ++ ist.

War es hilfreich?

Lösung

Ja, das ist durchaus möglich. Sie müssen eine Zwischenschicht in C ++ schreiben, die Funktionen mit extern "C" erklärt:

extern "C" int foo(char *bar)
{
    return realFoo(std::string(bar));
}

Dann werden Sie foo() von Ihrem C-Modul aufrufen, die den Aufruf an die realFoo() Funktion übergeben werden, die in C implementiert ++.

Wenn Sie eine vollständige C ++ Klasse mit Datenelementen und Methoden aufzudecken, dann müssen Sie möglicherweise mehr Arbeit, als dieses einfache Funktion Beispiel tun.

Andere Tipps

C ++ FAQ Lite: "Wie C und C ++ Code mischen" .

Einige Hinweise stehen in Antworten auf diese Fragen beschrieben:

  • [32.8] Wie kann ich ein Objekt einer C ++ Klasse zu / von einer C-Funktion übergeben?
  • [32.9] Kann meine C-Funktion in einem Objekt eines C direkt auf Daten zugreifen ++ Klasse?

Haupt Gotcha: Ausnahmen können nicht in C. gefangen werden, wenn es die Möglichkeit einer Ausnahme in dem C ++ Code steigen ist, entweder schreiben Sie Ihren C-Code oder C ++ Wrapper sehr sorgfältig. Umgekehrt Ausnahme wie Mechanismen (das heißt, Weitsprung) im C-Code (wie in verschiedenen Skriptsprachen gefunden) sind nicht erforderlich Destruktoren für C ++ Objekte auf dem Stapel aufzurufen.

Sie können C / C ++ Code mischen. Wenn Ihre main () Funktion in in C ++, dann nur Sie müssen sicherstellen, dass sich Ihre c Funktionen deklariert

extern "C"

Wenn Ihr Haupt C ist, dann sind Sie wahrscheinlich OK außer für statische Variablen. Jegliche Konstrukteuren mit statischen Variablen sollen vor main () Start aufgerufen werden. Dies wird nicht passieren, wenn C Ihr Haupt ist. Ich haben Sie eine Menge von statischen Variablen, das Beste, was zu tun ist, statische Variablen mit Singletons zu ersetzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top