Unterschiede zwischen C++ und C++/CLI



  • Hallo,

    ich habe immer mit C++/CLI programmiert, und möchte mir nun auch noch das normal C++ beibringen. Vorher möchte ich aber noch wissen, warum so viele mehr mit C++ programmieren (was die allein schon die Aufrufzahlen der beiden Programmiersprachen beweisen 😉 , bei CLI ca. 25.000 bei C/C++ über 400.000), als mit CLI. Meiner Meinung nach ist CLI einfacher als das native C++. Kann es evtl. sein, dass das das native C++ mehr Möglichkeiten bietet mit dem Betriebssystem zu interagieren bzw. wo liegen die Vorteile, wo die Nachteile?



  • Ich dachte immer C++/CLI wäre eine reine Erweiterung von C++ und damit eine Obermenge. In diesem Fall müsste dir ja schon alles bekannt sein und es sollte auch nicht mehr möglichkeiten für die Interaktion mit dem Betriebssystem geben.
    Kann aber auch gut sein, dass das nicht stimmt.

    Edit: Wikipedia sagt dazu:

    Kompatibilität mit bestehenden C++-Programmen durch das Einbringen von fast ausschließlich reinen Erweiterungen gegenüber ISO-C++.

    Was das

    fast ausschließlich

    beudetet, ist dann die Frage 🙂

    Ansonsten gibts noch zu sagen:
    Nachteile von C++/CLI: Läuft nur auf windows (soweit ich weiß). Man schleppt immer die .Net Laufzeitumgebung mit sich rum
    Vorteile von C++/CLI: Man kann auf Code der in .Net geschrieben ist zugreifen und hat mehr Sprachfeatures (Events, Properties, ...)



  • Also bietet C++/CLI die selben Funktionen, wie C++ und nur die Syntax ist anders und man muss andere Bibliotheken nutzen?



  • Also wie du vielleicht meinem ersten Post schon entnehmen konntest weiß ich selbst relativ wenig über C++/CLI, deswegen kann ich dir nur sagen, was ich glaube zu wissen^^

    C++/CLI ist soweit ich weiß nur eine Erweiterung von C++, es ist also C++ und mehr. Du musst keine anderen Bibliotheken benutzen, aber du kannst mehr benutzen, weil du zugriff auf .Net Bibliotheken hast.
    Du kannst aber alle standardbibliotheken von C++ weiterhin nutzen soweit ich weiß.
    CLI führt einige neue Keywords ein, wie "interface", "ref class", "gcnew" und du kannst auch properties und events benutzen. Wenn du auf standard-c++ umsteigst, wirst du das alles nicht mehr benutzen können.

    Am besten wartest du mal, bis jemand der sich etwas mehr auskennt was schreibt. Evtl. hättest du auch in der CLI sektion mehr Erfolg gehabt als hier.



  • Die Syntax ist weitgehend gleich, nur das es in C++ z.B. diese verwalteten Handels (^) nicht gibt. C++ hat auch kein for each, keine Properterys, es gibt nur eine Art von Klassen (keine Value-, Refernz- und Interface-Unterscheidung), events gibt es keine mehr, ... Sprich: Von der Syntax her kennt C++/CLI ein bisschen mehr, als normales C++, andere Sachen werden aber bei C++/CLI gar nicht genutzt (z.B. "waschechte" Pointer). Umgewöhnen musst du dich ein bisschen bei der Speicherverwaltung: Kein gcnew mehr. Du kannst entweder die Sachen mit new allokieren, musst sie dann aber wieder mit delete freigeben oder du lässt das new ganz weg. Arrays sind Sprach-Interna, d.h. keine Array-Klasse wies sie bei C++/CLI glaub ich gibt (stand C++03, ab C++11 gibts glaub ich zusätzlich std::array). Das dürften die harptsächlichen Syntax-Sachen gewesen sein.

    Aber: C++/CLI ist definitiv keine Obermenge von C++, da man z.B. keine C++/CLI-Objekte in einen std::vector stecken kann ohne dass es frühre oder später krachen wird (hab ich zu mindest gehört).



  • C++/CLI ist eine Erweiterung von C++, mit der man Zugriff auf das .NET-Framework und ein paar weitere Sprachfeatures hat. Allerdings wird die Sprache von Microsoft immer weniger unterstützt, der Hauptanwendungszweck von C++/CLI ist Interop.

    hustbaer hat vor einiger Zeit die Thematik recht ausführlich beschrieben, siehe hier.



  • Erstmal danke für alle Antworten 😃 .

    Meiner Meinung nach ist CLI leichter zu lernen, was aber auch daran liegen kann, dass ich mir jetzt ein bisschen schwer tue mich auf C++ ohne .NET umzustellen. Beispielsweise habe ich schon wieder aufs Neue vergessen, wie man eine neue Instanz einer Klasse in C++ erstellt 🙄 . Das ganze zu Mischen halte ich auch für keine gute Idee, da ich mich eben noch nicht sehr gut in C++ auskenne und so die Fehler praktisch schon "vorprogrammiert" sind 😃 .



  • Taeli schrieb:

    Beispielsweise habe ich schon wieder aufs Neue vergessen, wie man eine neue Instanz einer Klasse in C++ erstellt 🙄 .

    Ist doch ganz einfach:

    class foo
    {
        //...
    };
    
    int main()
    {
        foo instance; //und schon hast du ne Instanz erstellt  :D 
    
        //...
    
        return 0;
    }
    

    Und falls du gemeint hast wie man die Instanz auf dem Heap anlegt:

    //Klasse siehe oben
    int main()
    {
        foo *instance = new foo();
    
        //...
    
        delete instance;
        return 0;
    }
    

    EDIT: Fehlerhafte Formatierung korigiert



  • Und dasselbe Beispiel noch in C++/CLI:

    ref class foo
    {
    };
    
    int main()
    {
        foo instance; //und schon hast du ne Instanz erstellt :D
    
        // ...
    
        return 0;
    }
    

    Ist also von der Verwendung in diesem Fall genau gleich. Die Unterschiede machen sich aber bald bemerkbar:

    //Klasse siehe oben
    int main()
    {
        foo ^instance = gcnew foo();
    
        //...
    
        delete instance;
        return 0;
    }
    

    Ich fands immer ganz angenehm.



  • Jonas OSDever schrieb:

    C++ hat auch kein for each,

    Jein. Für die STL wurde for_each implementiert.

    Ergänzung:
    Im neuen Standard gibt es for each auch für andere Datenstrukturen:

    int main()
    {
      int bunny[] = {1,2,3,4,5};
    
      for (int& i: bunny)
        std::cout << i;
    }
    


  • /rant/ schrieb:

    //Klasse siehe oben
    int main()
    {
        foo ^instance = gcnew foo();
    
        //...
    
        delete instance; //<-- ???
        return 0;
    }
    

    Ich dachte in C++/CLI gibt man die Sachen nich mehr selber, dass macht doch der GC?!



  • Ja, der GC kann alles übernehmen. Aber man kann in gewissen Situationen auch mit Auto-Semantik und delete programmieren, wenn man will. Darum mag ich die Sprache. Leider wird sie von Microsoft totgeschwiegen und gekillt.

    😮



  • [Rewind] schrieb:

    Jonas OSDever schrieb:

    C++ hat auch kein for each,

    Jein. Für die STL wurde for_each implementiert.

    Ich bin von Schlüsselwörtern (und falls es foreach bei C++11 gibt: von C++03) ausgegangen. 😉



  • Jonas OSDever schrieb:

    Ich bin von Schlüsselwörtern (und falls es foreach bei C++11 gibt: von C++03) ausgegangen. 😉

    C++-foreach kommt ohne foreach-Schlüsselwort aus 😉



  • Jonas OSDever schrieb:

    /rant/ schrieb:

    //Klasse siehe oben
    int main()
    {
        foo ^instance = gcnew foo();
    
        //...
    
        delete instance; //<-- ???
        return 0;
    }
    

    Ich dachte in C++/CLI gibt man die Sachen nich mehr selber, dass macht doch der GC?!

    delete in C++ und delete in C++/CLI macht nicht dasselbe!
    In C++/CLI wird durch den delete Aufruf die Dispose() Methode aufgerufen (sofern vorhanden)!

    Hier noch was dazu:
    http://www.c-plusplus.net/forum/242975-10



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ (auch C++0x) in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ja, das ist klar. Es geht um die Semantik. Was in C++/CLI wie ein Destruktor aussieht, wird beim Kompilieren zu einem Dispose + compiler generated Finalizer. Der Operator delete ruft den IDisposable.Dispose auf dem Objekt auf, mit welchem Ressourcen freigegeben werden können. Am Ende gibt es einen Call GC::SuppressFinalize(this), wodurch der GC den Speicher beliebig reclaimen kann, da man die Arbeit ja bereits selbst gemacht hat 😉


Log in to reply