Definiere vorwärts deklarierte C-Struktur als C ++ - Struktur

8

Ist es legal, eine struct als C- struct

weiterzuleiten? %Vor%

und definieren Sie es anschließend als C ++ - struct , d. h. als Nicht-POD-Typ?

%Vor%

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.

    
phlipsy 10.07.2013, 10:50
quelle

2 Antworten

9

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.

    
Mats Petersson 10.07.2013, 10:54
quelle
2

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.

    
Tony Delroy 10.07.2013 11:16
quelle

Tags und Links