Kann man STL-Funktionen in einem reinem C-Projekt verwenden?



  • Hallo!

    Ich habe hier ein umfangreiches Projekt in reinem C. Jetzt möchte ich aber an einer Stelle die Lists Funktion der STL verwenden um mich in C nicht selber mit dem ganzen Mist, was doppelt verkettete Listen angeht, rumschlagen zu müssen. Funktioniert das irgendwie?

    Ich bräuchte eine Liste vom Typ struct auf die ich später aus der main() des C-Programms lesend und schreiben zugreifen kann. Dachte mir ich schreibe ein C++ Funktion der ich dann später sage "gib mir den Inhalt des Structs wo ID=xyz" bzw. "lösche Structinhalt, bei dem ID=xyz". Das Struct selber kann ich ja außerhalb der main() des C-Programms global definieren wenn es sein muss.

    Bisher habe ich noch nie mit C++ gearbeitet. Mein STL-Testprogramm läuft für sich alleine aber ganz gut. Zumindest kann es schon Elemente eintragen und suchen 🙂 Aber ich habe absolut keine Idee wie ich von C aus auf die Funktion zugreifen kann und wie ich dann die Rückgabe der Funktion bzw. die ganze Liste global in meinem C-Projekt verwenden kann.

    Ist das eventuell alles zu kompliziert was ich da vorhabe und sollte ich lieber die doppelt verkettete Liste in C selber programmieren?

    Ich steht momentan total auf dem Schlauch. 😞

    Würde mich über den ein oder anderen Tip freuen.

    Vielen Dank!!

    Gruß
    Thorsten



  • Hi,

    also Du musst schon einen C++-fähigen Compiler haben ... aber dann kannst Du Dir eine C-Lib basteln (Stichwort "C-Wrapper" ... gibt's schon einiges hier im Forum).
    Allerdings bleiben Dir einige C++-Schmackazien (compile-time-Typsicherheit) natürlich verwehrt und Du musst halt immer mit 2 Projekten rumhantieren, die Du synchronisieren musst...

    Gruß,

    Simon2.





  • Öh.
    Also normal geht das ganz einfach. Beispiel:

    // header:
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    int fupp(void); // void muss für C sein und C++ erlaubts netterweise
    
    #ifdef __cplusplus
    } // extern "C"
    #endif
    
    // .cpp für die lib:
    
    int fupp() // void ist hier nicht nötig, hier is ja immer C++ am Werk...
    {
        try
        {
            // ... feste STL und was auch immer verwenden ...
            return 123;
        }
        catch(...)
        {
            return -1;
        }
    }
    

    Die LIB kompilierst du dann einfach mit deinem C++ Compiler und verwendest sie mit deinem C Compiler. Bzw. die meisten Compiler können auch innerhalb eines Projektes mischen, also extra ne LIB machen zu müssen.

    Doof ist halt dass man an der C <-> C++ Schnittstelle mit den Exceptions aufpassen muss, wenn eine Exception in den C Teil fliegt wird der C Teil ziemlich doof schauen und ziemlich wenig damit anfangen können wenn ich es mal so farbig formulieren darf 🙂



  • Reines C ist das zwar auch nicht, aber du könntest in einem C++-Code das Template instanziieren und zu deinem Projekt linken. Nun kannst du von C aus die gemangelten Methoden (unter Berücksichtigung der Call-Conventions) aufrufen. 😃

    Nein, ehrlich gesagt ist dein Vorhaben sinnlos. Die STL ist derartig C++ (Klassen, Templates, Operator-Überladung etc. gibt es in C nicht). Mit so etwas wie sglib (siehe vistas Beitrag) solltest du gut bedient sein.



  • Also wenn dein Compiler C++ fähig ist, brauchst du einfach eine extra .cpp Datei erzeugen und mittels 'extern "C"' die Schnittstellenfunktion deklarieren (eine eigene Lib ist dann nicht nötig).


Anmelden zum Antworten