C++ Funktionen von C aufrufen

  • Erst mal können !!!

    Ich habe bisher nur etwas gefunden, um C von C++ aufzurufen. Das ging über:

    extern "C"

    extern void funktion(....);

    Also ahne ich, daß ich für die benötigten C++ Funktionen eine Header-Datei erstellen muß, die mit extern "C++" anfängt. Muß die C++ Funktion, die ich aufrufen will dann static sein?
    AlexCode ist 1q2w3e
  • Ich möchte eine C++ Funktion schreiben, die einen Dateiinhalt prüft, und ein bool zurück liefert. Übergeben wird ein DataHandler.

    Wie würde ich die Funktion definieren?

    Wie würde ich die Funktion von C aus aufrufen?

    Oder schreibe ich diese Funktion gleich in C (ich muß dafür aber eine vielzahl von C++ Objecten definieren und mit den entsprecheneden Funktionen bearbeiten). Dies halte ich für den schlechteren Ansatz.
    AlexCode ist 1q2w3e
  • Original von 1q2w3e
    Oder schreibe ich diese Funktion gleich in C (ich muß dafür aber eine vielzahl von C++ Objecten definieren und mit den entsprecheneden Funktionen bearbeiten). Dies halte ich für den schlechteren Ansatz.


    Ich sehe ehrlich gesagt den Unterschied im Aufwand nicht

    Alex
    The only thing that really worried me was the ether.
  • Original von Tom9811
    Beispiel:

    Quellcode

    1. meine_funktion( parameter );


    Die Funktion meine_funktion( parameter ) ist dann auf der c++ Seite einr static Funktion ?

    Übergebe ich der C Datei den C++ Header? Oder muß der Header modifiziert werden? Oder keinen Header?
    AlexCode ist 1q2w3e
  • Nein, das war ein kleiner Cherz von Tom.

    Er will damit wohl sagen, mehr als Allgemeinplätze kann man bei Deiner Fragestellung kaum zum besten geben.

    Und ob Du Deine Funkiont als a (b) oder a::b(c) definierst, die Objekte musst Du doch immer noch anlegen.

    Fang mal und poste mal Code

    Alex
    The only thing that really worried me was the ether.
  • Ich denke, dass sein Problem ist, dass er nicht weiß, wie man das Problem löst, dass C keine Ahnung von Klassen und Objekten hat.

    Also, C ist nunmal nicht objektorientiert. Schreib dir C++-Wrapperfunktionen, die deine Klassen, von der C-Seite aus gesehen, verstecken und intern alle Zugriffe regeln. Gewöhnliche C++-Funktionen, die nicht Teil von Klassen sind, kannst du ohne weiteres aufrufen. Natürlich nur dann, wenn sie keine Objekte als Parameter erwarten. Templates kannst du logischerweise auch nicht verwenden.

    Alternativ könntest du dein Projekt auch in C++ entwickeln und nur die Quicktime-Routinen als extern "C" deklarieren und dann benutzen. Bin leider kein Experte auf dem Gebiet, aber es müsste funktionieren.

    vbinsider
  • Also als erstes mal Danke für die rege Beteiligung, da habe ich ja was losgetreten.

    Ich werde jetzt erst einmal etwas Code schreiben und Morgen posten.

    Ich hatte gehofft einen Tip für den richtigen Ansatz zu bekommen, oder ein paar Beispiele, aus denen ich mir den richtigen Ansatz raus suchen kann. Ich mache mir gewöhnlich vorher gedanken, wie ich ein Probem an gehe. Beim drauf los programmieren, kommt meiner Erfahrung gewöhnlich nichts wirklich Gutes raus und ich programmiere es dann noch einmal neu.

    Vielen dank an Tom9811 für das Beispiel. Ich wußte nicht das es evt. so einfach geht. Ich hatte gelesen, daß C und C++ Code vom Compiler ganz unterschiedlich behandelt wird.

    Vielen dank auch an vbinsider, so wie in Deinem ersten Beispiel werde ich es angehen.
    AlexCode ist 1q2w3e
  • Von C aus kannst Du nur "extern C" Funktionen aufrufen, dazu müssen alle Exceptions innerhalb der C++ -Funktionen abgefangen werden, da es nicht definiert ist, was passiert, wenn eine nicht abgefangene C++ Exception durch C Code propagiert wird. Viele Compiler spielen da gutmütig mit bei anderen macht's einfach bumm. Keine Ahnung wie's bei Apples gcc aussieht.

    Also mußt Du C++ Wrapper Code schreiben, der alles vor dem C Code versteckt und alle Exceptions abfängt.

    Quellcode

    1. extern "C" int foo () {
    2. try {
    3. cpp::foo(); // Platzhalter für C++ Code
    4. }
    5. catch (...) {
    6. errno = MY_ERROR_CODE;
    7. return -1;
    8. }
    9. return 0;
    10. }
  • Original von vbinsider
    Gewöhnliche C++-Funktionen, die nicht Teil von Klassen sind, kannst du ohne weiteres aufrufen.

    Das wird allein wegens des Name Manglings beim Linken nicht funktionieren. Zudem verwenden viele Compiler andere Aufrufkonventionen für C++-Funktionen in Relation zu C-Funktionen.
    Dieser Code

    C-Quellcode

    1. #include <iostream>
    2. #include <ostream>
    3. int foo () {
    4. return 0;
    5. }
    6. extern "C" int goo () {
    7. return 0;
    8. }

    Ergibt folgende Ausgabe von "nm". Man beachte die unterschiedliche ABI von goo und foo.

    Quellcode

    1. 00000198 s EH_frame1
    2. 00000160 s __GLOBAL__I__Z3foov
    3. 00000204 s __GLOBAL__I__Z3foov.eh
    4. 00000000 T __Z3foov
    5. 00000000 A __Z3foov.eh
    6. 000000e4 s __Z41__static_initialization_and_destruction_0ii
    7. 000001dc s __Z41__static_initialization_and_destruction_0ii.eh
    8. U __ZNSt8ios_base4InitC1Ev
    9. U __ZNSt8ios_base4InitD1Ev
    10. 00000240 b __ZSt8__ioinit
    11. U ___cxa_atexit
    12. U ___dso_handle
    13. U ___gxx_personality_v0
    14. 00000040 t ___tcf_0
    15. 000001b4 s ___tcf_0.eh
    16. 00000020 T _goo
    17. 00000000 A _goo.eh
    18. U dyld_stub_binding_helper
    Alles anzeigen