# C++ Methoden aus dem C Code aufrufen



## nabensa (2. März 2004)

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


----------



## Kachelator (2. März 2004)

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.


----------



## basd (2. März 2004)

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


----------



## Kachelator (2. März 2004)

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.


----------



## nabensa (3. März 2004)

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.


----------



## basd (4. März 2004)

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


----------



## Kachelator (5. März 2004)

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!


----------

