Ein C ++ Objekt in extern "C" verpacken

7

Betrachten Sie eine einfache Beispielklasse:

%Vor%

Nun sage ich, dass ich das in extern "C" einfügen möchte, damit ich es aus vielen verschiedenen Programmiersprachen wie C # und Java aufrufen kann. Ich versuchte folgendes, was zu funktionieren schien:

%Vor%

Ist das tragbar? Ist der Typ unsigned "unsigned long" groß genug für einen Objektzeiger? Irgendwelche anderen Probleme mit diesem Ansatz?

Vielen Dank im Voraus für die Antworten!

    
Andreas W.P. 27.05.2011, 13:39
quelle

6 Antworten

10

Ja. Es ist schlecht. Wirklich schlecht. unsigned long - nur nein. Geben Sie ein korrekt eingegebenes BankAccount* zurück - die anderen Sprachen sehen es am anderen Ende als generischen Zeiger (z. B. System.IntPtr), und es ist nicht erforderlich, einen nicht typisierten Zeiger zurückzugeben, wenn die binäre Schnittstelle ohnehin keine Zeiger eingibt.

%Vor%     
Puppy 27.05.2011 13:44
quelle
9

Das sieht grundsätzlich gut aus mit einem Vorbehalt. Der Versuch, einen Integer-Typ zu verwenden, um einen Zeiger zu halten, ist keine gute Idee - viel besser, void* zu verwenden, da dies definitionsgemäß die Breite eines Zeigers ist.

Eigentlich glaube ich, @ DeadMGs Antwort ist ein sauberer Ansatz als das.

    
David Heffernan 27.05.2011 13:42
quelle
5

Typ-stark ist sogar besser als void *.

%Vor%     
Renaud 27.05.2011 13:55
quelle
3

Dies ist nicht portierbar, weil unsigned long für einen Zeiger möglicherweise nicht lang genug ist. Eine nicht so seltene Plattform, wo dies passiert, ist win64.

Besser ptrdiff_t oder void* verwenden.

    
hirschhornsalz 27.05.2011 13:44
quelle
3

Es wäre wahrscheinlich plattformabhängig, ob long groß genug ist (wahrscheinlich nicht auf x86-64), eine Alternative ist es, etwas wie sig zu verwenden >

    
Asgeir 27.05.2011 13:44
quelle
2

Ich würde void * anstelle von unsigned long verwenden.

    
ralphtheninja 27.05.2011 13:47
quelle

Tags und Links