C++ Methoden aus dem C Code aufrufen

nabensa

Grünschnabel
Hallo alle,

ich habe das folgende Problem:

ich möchte von meinem C Code(wird mit einem c compiler kompiliert ) aus , auf die Methoden einer c++ Klasse zugreifen. (damit sie für mich bestimmte Low level Operationen durchführten).

Wie kann ich das machen, wenn beide mit verschiedenen Compiler kompiliert werden müssen? hat jemand von euch da eine Idee?

ich bedanke mich im voraus


Ben
 
Auf die Klassenmethoden kannst du auf keinen Fall direkt zugreifen. Du musst dir Wrapperfunktionen in C++ bauen, die das erledigen können. Diese Funktionen müssen von C aus aufrufbar sein. Dazu müsstest du sie als (und jetzt rate ich mal so halb) "extern C" deklarierern, um das Namemangling von C++ zu verhindern. Genau erinnere ich nicht mehr. Bitte um Korrektur, aber das war es so ungefähr, auf das es ankam. Ich sehe selber auch nochmal nach, wie das ging.
 
in einer Datei (*-cpp) schreibst du eine Funktion die auf die Methode zugreift.
Aussen rum noch
#ifdef __cpluplus
extern "C"
{
#endif

void Funktion(CClass* cclass)
{
cclass->Methode();
}


#ifdef _cpluplus
}
#endif


Im Header muss die Funktion entsprechend auch in die #ifdef
 
Dank auch von mir.

Allerdings frage ich mich, wie nabensa an die Adresse des Objektes drankommt. In reinem C ist die Klasse doch garnicht vorhanden.

"#ifdef __cpluplus" <-- da fehlt ein 's', oder? Sollte "cplusplus" sein, nehme ich an.
 
erstmals vielen vielen dank für euch beide
Da ich unterqualifiziert bin, hätte ich gerne eine detaillierte Erklärung.:(

@basd, könntest du bitte deine Codezeilen kommentieren.
Das wäre sehr hilfreich für mich.
 
Ja des muss __cplusplus heißen.

Der C Compiler muss nur den Einsprungspunkt der Funktion kennen.
Ich habe sowas mal mit einer DLL gemacht. Zeiger sind ja von der größe her immer gleich (deswegen kann man auch immer in void* casten). Hier mal ein Beispiel | mit Kommentaren||wie man sich das vorzustellen hat
(In einem Header lässt du einfach die Funktions körper weg )

#ifdef __cplusplus // Prüfe ob es ein C++ Compiler ist
extern "C" // wenn ja definiere die Funktion als C Schnittstelle (überladen
// nicht möglich)
{ // gültigkeit von extern "C" definieren
#endif // Ende der Anweisung für C++ Compiler

void* Create(void) // Funktion zum Erstellen eines Objekts
{
CClass* cclass;
cclass = new CClass();

return cclass;
}

void Funktion(CClass* cclass) // ruft Methode auf
{
cclass->Methode();
}

void Destroy(CClass* cclass) // zerstört Objekt
{
delete cclass;
}
#ifdef _cpluplus // Falls C++ Compiler
} // schließe extern "C" Anweisung
#endif // Ende der Prüfung ob C++ Compiler
 
Jetzt verstehe ich auch, wie C an ein Objekt der Klasse kommt: Mit Hilfe der Create()-Funktion! Da bin ich vorher nicht drauf gekommen, ob die Lösung ja nahe liegt. Vielen Dank!
 
Zurück