Seite 1 von 1

C++ aus C heraus aufrufen

Verfasst: Fr Mär 05, 2010 11:39 am
von Jside
Hi, ich hab mein eigenes Framework programmiert, und bastle gerade Python bindings dafür. diese benötigen jedoch C funktionen(= mit C Signaturen(!)) und folglich würde es mich Interessieren, wie ich C++ Klassen(!!) aus C heraus aufrufe.

...anyone?

Re: C++ aus C heraus aufrufen

Verfasst: Fr Mär 05, 2010 12:17 pm
von Xin
Jside hat geschrieben:Hi, ich hab mein eigenes Framework programmiert, und bastle gerade Python bindings dafür. diese benötigen jedoch C funktionen(= mit C Signaturen(!)) und folglich würde es mich Interessieren, wie ich C++ Klassen(!!) aus C heraus aufrufe.
Achtung(!): Diese Antwort ist nicht unbedingt die einzig glücklichmachende Lösung, da ich mich mit Python-Bindings nicht gut genug auskenne.

Entweder indem Du die Signaturen abschreibst, was eher unschön ist, oder Du Wrapperklassen erzeugst, die entsprechende C-Funktionen aufrufen, was auch nicht wirklich schön ist, aber auch noch funktioniert, falls GCC die Methoden mal anders benennt oder Du VC++ benutzen willst.

Code: Alles auswählen

// wrapper.h
extern "C" int NewMyClass();
extern "C" void FuncCall( int this );

//wrapper.c
int NewMyClass
{
  return reinterpret_cast< int >( new MyClass() );
}

void FuncCall( int this )
{
  reinterpret_cast< MyClass * >( this )->FuncCall();
}
In Python deklarierst Du dann eine Klasse, die nur das int-Handle hält und bei der Python-Memberfunkion FuncCall entsprechend die C-Funktion FuncCall(int) ruft, die dann die Methode der C-Klasse ruft.
Jside hat geschrieben:...anyone?
Das hier ist keine Versteigerung.

Re: C++ aus C heraus aufrufen

Verfasst: Mo Nov 01, 2010 9:52 pm
von AnGaiNoR
Ich grab diesen Thread mal wieder aus. :)
Die Wunderbibliothekensammlung Boost bietet auch hierfür eine elegante Lösung. Dazu könntest du dir mal Boost.Python anschauen

Re: C++ aus C heraus aufrufen

Verfasst: Do Nov 04, 2010 8:55 pm
von Jside
AnGaiNoR hat geschrieben:Ich grab diesen Thread mal wieder aus. :)
Die Wunderbibliothekensammlung Boost bietet auch hierfür eine elegante Lösung. Dazu könntest du dir mal Boost.Python anschauen
Genau boost::python oder andere Wrapper wollte ich nicht benutzen, da insbesondere boost nur Probleme auf einer Platform, die ich benutze macht...