Ist es legal, eine struct
als C- struct
und definieren Sie es anschließend als C ++ - struct
, d. h. als Nicht-POD-Typ?
Die allgemeine Absicht besteht darin, über eine C-Schnittstelle einen extern zugänglichen undurchsichtigen Typ handle_t
zu erhalten, der intern als C ++ - Datentyp implementiert ist.
Ja, das wird gut funktionieren, solange der C-Code niemals "innerhalb" der handle_tag
-Struktur sehen muss, und die entsprechende C ++ - Konstruktion / -Zerstörung wird vom C ++ - Code durchgeführt (dem ich die construct
und destruct
sind für).
Alles, was der C-Code benötigt, ist ein Zeiger auf eine Datenstruktur - er wird nicht wissen, was der Inhalt ist, also kann der Inhalt alles sein, was Sie wollen, einschließlich Konstruktor / Destruktor-abhängiger Daten.
Bearbeiten:
Ich sollte darauf hinweisen, dass dies oder ähnliche Methoden (z. B. ein void *
verwenden, um die Adresse eines Objekts für den C-Abschnitt auf hold
aufzuzeichnen), eine ziemlich häufige Möglichkeit ist, C-Code mit C ++ - Funktionalität zu verbinden.
Bearbeiten2:
Es ist wichtig, dass der aufgerufene C ++ - Code keine Ausnahmen in den C-Code "leckt". Das ist ein undefiniertes Verhalten, das sehr wahrscheinlich zu Abstürzen führt oder schlimmeren "komischen Sachen", die nicht abstürzen ... Es sei denn, der Code garantiert keine Ausnahmen (und zum Beispiel std::string
kann bad_alloc
im Falle von wenig Speicher), ist es erforderlich, einen try/catch
Block in Code wie construct
anf func
in der C ++ Seite zu verwenden.
Funktioniert nicht ganz so wie es ist, aber das Konzept ist in Ordnung. Wenn die Funktionen definiert sind , müssen Sie auch sicherstellen, dass die Namen nicht verändert werden, damit der C-Code sie finden kann. Das heißt, #include "api.h"
sollte auf Ihrer api.cpp-Datei hinzugefügt werden.
Tags und Links c c++ forward-declaration