Wie lernt man gutes C++ zu schreiben?



  • Gutes C++ lernst du, in dem du regelmäßig in Foren liest, was schlechtes C++ ist. :schland:



  • GoodCpp schrieb:

    Danke für deine ausführliche Antwort. Eins ist mir dabei aber nicht klar. Ich kann also durch das Buch "Eine Tour durch C++" nicht gutes C++ lernen. Du empfiehlst aber ein Buch von Stuppi zum Lernen von gutem C++. Das Buch "Eine Tour durch C++" ist aber auch von Struppi und stellt einen erweiterten Auszug aus seinem Standardwerk dar. Mit dem einem Buch von Stuppi lerne ich also gut und mit dem anderen weniger gut??? Könntest du bitte meinen Knoten im Kopf in dem Bezug lösen?

    Gutes Deutsch lernst Du nicht aus einem Wörterbuch. Da kannste nur die Wörter lernen. Aber hast dann doch noch keine Ahnung, wie Du Sätze baust und gar keine Ahnung, wie Du Bedeutung in die Sätze legst. Und bist extrem weit weg davon, einen Schimmer einer Ahnung davon zu haben, was gutes Deutsch ist.



  • Ok, das wäre noch eine Quelle des guten Lernens. ABER, es wurde auch gesagt das einige C++ gut können und viele eben nicht. Nun wird sich dieses Verhältnis auch sicherlich auf die Forenmitglieder übertragen lassen. Woran erkenne ich nun wer hier Ahnung hat und wer nicht?

    Gibt es nicht irgendeinen roten Faden der mich zu gutem C++ führt? Wenn es den nicht gibt, wie soll dann der Nachwuchs gutes C++ lernen?



  • Gutes Deutsch kann man schon aus einem Buch lernen, denke ich. Es gibt ja nicht nur Wörterbücher, genau wie es bei C++ sicherlich nicht nur Referenzen der Sprache gibt. Es muss doch auch irgendwo niedergeschrieben sein, was ich mit den Möglichkeiten von C++ anfangen kann und wie ich es so nutze das es "guter" C++-Code wird.



  • GoodCpp schrieb:

    Du empfiehlst aber ein Buch von Stuppi zum Lernen von gutem C++.

    Welches Buch von Struppi empfehle ich zum Lernen von gutem C++?



  • GoodCpp schrieb:

    Nun wird sich dieses Verhältnis auch sicherlich auf die Forenmitglieder übertragen lassen. Woran erkenne ich nun wer hier Ahnung hat und wer nicht?

    Wie in der Politik. Machs wie alle und höre auf den, der am lautesten schreit, oder begutachte die öfters mitangegebenen Begründungen und stufe die Aktöre mit der Zeit ein.

    GoodCpp schrieb:

    Gibt es nicht irgendeinen roten Faden der mich zu gutem C++ führt? Wenn es den nicht gibt, wie soll dann der Nachwuchs gutes C++ lernen?

    Nee, einen Königsweg gibt es nur für die Geometrie.



  • Ich sagte "Gutes Deutsch lernt man nicht aus einem Wörterbuch" und Du widersprichst mit "Gutes Deutsch kann man schon aus einem Buch lernen".
    Da stimmt doch was nicht.

    "Eine Tour durch C++" ist dabei das Wörterbuch. Es ist kein Lehrbuch.



  • GoodCpp schrieb:

    Es muss doch auch irgendwo niedergeschrieben sein, was ich mit den Möglichkeiten von C++ anfangen kann und wie ich es so nutze das es "guter" C++-Code wird.

    Dazu schickte ich Dir den Link https://www.c-plusplus.net/forum/251551-full
    Bitte verfolge meine Links, dazu gebe ich sie an.



  • Ok danke, ich werde mir die Bücher besorgen.



  • Noch eine Frage an diejenigen die schon eine Weile auf dieser Reise sind. Wie lange braucht es im Durchschnitt um gutes C++ zu lernen?



  • GoodCpp schrieb:

    Noch eine Frage an diejenigen die schon eine Weile auf dieser Reise sind. Wie lange braucht es im Durchschnitt um gutes C++ zu lernen?

    Ein Leben lang.

    Nach ein paar Jahren bist du vielleicht kein Grünschnabel mehr ...



  • Ist das wirklich so heftig? Wenn dem so wäre, dürften nur extrem wenige gutes C++ beherrschen und das wäre ein Desaster für so ziemlich jedes C++-Projekt da draußen. Also jetzt mal im ernst. Wenn jemand schon programmieren gelernt hat, welche Zeit sollte er mindestens einplanen um guten C++ zu beherrschen?



  • GoodCpp schrieb:

    Ist das wirklich so heftig? Wenn dem so wäre, dürften nur extrem wenige gutes C++ beherrschen und das wäre ein Desaster für so ziemlich jedes C++-Projekt da draußen. Also jetzt mal im ernst. Wenn jemand schon programmieren gelernt hat, welche Zeit sollte er mindestens einplanen um guten C++ zu beherrschen?

    Mal meine Geschichte:

    Ich habe C gelernt. Heftig C gelernt. Die letzten 8 Jahre. C ist weniger komplex als C++, aber ein paar Sachen hast du in beiden Sprachen halt so drin.

    Ich finde noch heute Sachen in meinen Codes von vor 9 Monaten, wo ich mich frage, was zum Teufel ich mir dabei gedacht habe. Vielleicht bin ich in der Hinsicht aber auch nur Nazi.

    void foo()
    {
        if(bla)
        {
            /*Code*/
            /*Mehr Code*/
            /*Ganz viel Code*/
            /*Coooooooooode*/
        }
        else
        {
            return;
        }
    }
    

    Würde ich so einen Code bei einem Audit sehen, würde ich fragen, welcher Suffkopp das so geschrieben hat.

    void foo(void)
    {
        if(!bla)
            goto END;
    
        /*Code*/
        /*Mehr Code*/
        /*Ganz viel Code*/
        /*Coooooooooode*/
    
    END:
        return;
    }
    

    Warum das Label und das goto ? Weil die Erfahrung zeigt, dass man den Code irgendwann noch mal anfasst und dann Ressourcen reserviert. Aber aufgerufene Funktionen können fehlschlagen. Dann muss man die Ressourcen wieder freigeben. Im jeden Fehlercheck-Block wieder Code zu haben, der sich um das Freigeben von Ressourcen zu exakt diesem Punkt in der Ausführung kümmert, kann leicht 300 Zeilen ausmachen. Gute Programmierer schreiben den Code so hin, dass der kritische Pfad beieinander liegt, und dass es keine Redundanzen gibt. Oh, nicht im Kompiliat, sondern auf Quellcode-Ebene.

    Sie sagen dir, goto ist böse. Und das stimmt auch für einfache Schleifenkonstrukte. Aber lokal auf Funktionen begrenzt, um tatsächlich Code einzusparen, sind sie das nützlichste, was mir bisher unter die Finger gekommen ist. Jetzt kommt es aber: viele Programmierer denken darüber nicht nach. Ja klar, wenn man dir das einmal im Forum neutral erklärt, dann ergibt das natürlich Sinn, so viele Pfade wie möglich zusammenzufassen. Aber erklär das mal einem Programmierer, der neben dir sitzt, für LOCs bezahlt wird und für Bugs abgestraft. Den interessiert nur, ob der Code fehlerfrei ist. Ob er lesbar ist? Nö, dafür wird der Typ von extern geholt, der darf sich dann durch tausende LOCs wühlen.

    Wenn du ein lustiges Wochenende verbringen willst, schau dir einfach mal die Quellcodes von ein paar OSS C/C++-Projekten an. Muss nix großes wie PCSX2 sein (über die kann ich nur stänkern, bis die Schwarte kracht). Wie das überhaupt eingecheckt werden konnte, frage ich mich bis heute ... ach nee, tue ich nicht, ich weiß es ja. Stichwort Heartbleed. Da hat jemand, der keine Ahnung von Protokolldesign hatte, für seine Forschungsarbeit an einem Protokoll gearbeitet. Weiter ins Detail möchte ich nicht gehen, aber das eine: das hat er dann OpenSSL angeboten. Eine Stunde nach Mitternacht. Am Neujahrstag. Die Leute schauen sie das nicht wirklich an, das wird nur schnell-schnell eingepflegt.

    Fazit: wenn du wirklich gut in einer Sprache werden willst, rechne ungefähr so viel Zeit ein, wie du zum ordentlichen Lernen einer menschlichen Sprache verbringen würdest - auch wenn diese aufgrund der Ausspracheregeln, die dir beim Programmieren fehlen, einfacher ist.

    Und das sage ich dir, der C macht statt C++. C++ ist noch mal eine Ecke komplexer.



  • Au Backe, das klingt nach USA. Jeder kann eine scharfe Waffe(C++) tragen und wenn jeder sich an Regeln hält "kann" das auch gut gehen.

    Wie kann man es hinkriegen dass jeder in ein paar Monaten C++ so gut beherrscht, dass er keinen Bockmist baut? Kann nicht der Compiler einfach bestimmte Sachen nicht erlauben, die extrem gefährlich sind? Oder kann man nicht wie wohl bei Rust bestimmte Teile als unsafe bestimmen, damit man sich im Zweifelsfall nur durch diese Bereiche hangeln muss?

    Die neuen C++ Standards sollen ja viele Verbesserungen erfahren haben. Ich selbst kann das alles nicht beurteilen, sondern ich versuche nur meine Weg zu gutem C++ mit Hilfe des Forums hier abzustecken. Das scheint gar nicht so einfach zu sein. Klar könnte ich einfach einen andere Programmiersprache wählen, aber ich bin halt sehr an der Königsklasse interessiert. Die Sprache soll mich unterstützen und mich nicht aufhalten. Da C++ aber sooo viele Möglichkeiten bietet empfinde ich es als sehr schwer die für mich wirklich notwendigen Sachen raus zu filtern.



  • @dachschaden

    sorry aber das ist totaler Quark den du hier schreibst - deine "goto END" hilft dir nur dein nicht sauber in Funktionen zerlegten Code wartbar/überschaubar zu halten - und wenn viele andere in vielen Funktionen deinem Beispiel folgen ist das definitiv eine Wartungshölle - und das ist alles andere als OK

    und C++ ist nicht wirklich komplexer als C - ausser RAII (was hier den goto voellig unnlötig macht) muss man ja nicht komplett alles was eine Sprache bietet auch (aus)nutzen



  • Gast3 schrieb:

    sorry aber das ist totaler Quark den du hier schreibst - deine "goto END" hilft dir nur dein nicht sauber in Funktionen zerlegten Code wartbar/überschaubar zu halten - und wenn viele andere in vielen Funktionen deinem Beispiel folgen ist das definitiv eine Wartungshölle - und das ist alles andere als OK

    Ich habe hier eine Funktion, die auf Windows und Linux Verzeichnisse rekursiv durchgeht, und dabei noch ein bisschen Speichermanagement macht. Allein in der Initialisierungsfunktion (die dann die rekursive Funktion ausführt) habe ich 8 Fehlerpfade, für die unterschiedliche Ressourcen freigegeben werden müssen. Diese Funktion hatte ohne diese Fehlerlabels 50 Zeilen mehr Code, der komplett, aber auch komplett redundant ist. Das Einzige, worauf man achten muss, ist die Benamung der Labels,

    Eine Wartungshölle sieht anders aus. Aber vielleicht hast du auch noch nie guten Code gesehen. Ich habe auf jeden Fall genug schlechten Code gesehen, um solchen zu erkennen.

    Gast3 schrieb:

    und C++ ist nicht wirklich komplexer als C - ausser RAII (was hier den goto voellig unnlötig macht) muss man ja nicht komplett alles was eine Sprache bietet auch (aus)nutzen

    Sag an. 🙄 Deswegen auch vorher der Disclaimer, dass ich von der C-Seite komme. Weil, C hat halt kein automatisches RAII (Thank Fu​ck), und ich persönlich halte es für leicht unnötig - aber das habe ich bereits oft genug hier geschrieben.

    Meine Beispiele für C waren genau das - Beispiele für C. In C++, da bin ich mir sicher, gibt es mitunter auch zusätzliche Szenarien, auf die man aufpassen sollte. Abgesehen da, wo Sprachfeatures das halt automatisch machen und man dann ctor- und dtor-Aufrufe mit sich rumschleppt.

    EDIT: Und bevor mir deswegen wieder einer vor den Mund fährt - nein, ich sage nicht, ctor und dtor sind automatisch langsam. Ich sage, ich habe dadurch zwei Funktionsaufrufe, die sehr langsam sein können, die ich nicht kontrollieren kann, und bei denen ich (als Nutzer, nicht als jemand, der am Code arbeitet) nicht auf Anhieb sagen kann, ob die Operation teuer ist oder nicht, ohne vorher in den Source zu schauen. Bei C habe ich die Kontrolle darüber, und dann kann ich auch den kritischen Pfad zusammenlegen.

    EDIT 2:

    GoodCpp schrieb:

    Au Backe, das klingt nach USA. Jeder kann eine scharfe Waffe(C++) tragen und wenn jeder sich an Regeln hält "kann" das auch gut gehen.

    C++ ist, muss man an der Stelle sagen, halt angenehmer. Komfortabler. Ich hingegen mag es eher einfacher. Diese goto -Struktur habe ich übrigens vom Lesen von disassemblierten Maschinencode übernommen, weil die Compiler das meistens auch so machen. Also, versuchen, den Code zusammenzulegen.



  • GoodCpp schrieb:

    Die neuen C++ Standards sollen ja viele Verbesserungen erfahren haben. Ich selbst kann das alles nicht beurteilen, sondern ich versuche nur meine Weg zu gutem C++ mit Hilfe des Forums hier abzustecken. Das scheint gar nicht so einfach zu sein. Klar könnte ich einfach einen andere Programmiersprache wählen, aber ich bin halt sehr an der Königsklasse interessiert. Die Sprache soll mich unterstützen und mich nicht aufhalten. Da C++ aber sooo viele Möglichkeiten bietet empfinde ich es als sehr schwer die für mich wirklich notwendigen Sachen raus zu filtern.

    C++ ist keine Königsklasse, sondern einfach nur ein Abkömmling von C. Man hat Möglichkeiten geschaffen, genuinen C-Problemen aus dem Weg zu gehen, dafür aber völlig neuartige Fallstricke eingebaut.

    Wie du schon schriebst, bietet C++ eine beträchtliche Fülle an möglichen Herangehensweisen an eine Programmieraufgabe. Ich persönlich empfehle, immer das Einfachste zu nehmen, so dass der Code übersichtlich und selbstdokumentierend bleibt.

    Der Mensch hat irgendwie einen Hang dazu, alles zu verallgemeinern. Dadurch fühlt er sich schlauer als die anderen. Doch Hinzufügen von Komplexität ist selten gut.



  • Ich habe hier eine Funktion, die auf Windows und Linux Verzeichnisse rekursiv durchgeht

    hört sich für mich eben nach goto + kleine #ifdef-Party in 2 Funktionen an - und das ist an sich auch nicht so schön

    ich hab hier auch eine solche Funktion(en) nur eben für 5 Platformen (Win,Linux,WinCE,Solaris und VxWorks) und habe auch schöne Fehlerbehandlung/Verarbeitung

    das ganze ohne Redundanz, goto und viele #ifdefs
    WEIL ich sonst keine sauberen Test mit 100% Coverage dafür schreibe kann - ohne das mir die Hände bluten

    aber dein Code ist bestimmt trotzdem nicht so schlecht wie ich es habe klingen lassen



  • Gast3 schrieb:

    hört sich für mich eben nach goto + kleine #ifdef-Party in 2 Funktionen an - und das ist an sich auch nicht so schön

    Klein ist da nicht wirklich was, die Initialisierungsfunktion ist 300 LOCs groß, die rekursive Funktion 200 LOCs. 50 LOCs einfach mal komplett entfernen zu können ist da schon was. Zumal man dann auch weiß, wo man nach Speicherlecks zu suchen hat.

    Gast3 schrieb:

    ich hab hier auch eine solche Funktion(en) nur eben für 5 Platformen (Win,Linux,WinCE,Solaris und VxWorks) und habe auch schöne Fehlerbehandlung/Verarbeitung…

    Zeigen.

    Gast3 schrieb:

    das ganze ohne Redundanz, goto und viele #ifdefs

    Zeigen. Ich verwende das WinAPI für Windows ( FindFirstFile , FindNextFile ) und das Directory-API für Linux ( opendir , readdir - was eigentlich auch alle POSIX- und BSD-Systeme einbezieht, nur hab ich's da halt nicht getestet), da verwende ich keine externe Library, die wieder Schindluder treiben könnte. Den Pfad baue ich über einen Buffer, die über die komplette Rekursion mitübergeben wird, um den für die derzeitige Ausführung wichtigen Pfadteile bauen zu können. Und der Grund, warum ich dies über eine zweite Funktion mache, ist um den Footprint auf den Stack zu verringern, weil sonst jede Ausführung wieder ein bisschen was vom Stack wegfrisst. Und natürlich in C, nicht C++.

    Wenn du das toppen kannst, bei aller Liebe - korrigiere mich.

    Gast3 schrieb:

    WEIL ich sonst keine sauberen Test mit 100% Coverage dafür schreibe kann - ohne das mir die Hände bluten

    Wieso dat denn? 😕 Noch nie was von Error-Codes gehört, auf die man prüfen kann, ob ein spezieller Test jetzt fehlgeschlagen hat? Oder übersehe ich da nur grad fett was?

    Gast3 schrieb:

    aber dein Code ist bestimmt trotzdem nicht so schlecht wie ich es habe klingen lassen

    Um meinen Code geht es mir dabei eigentlich gar nicht mal so. Sondern dass goto ein mächtiges Werkzeug ist, welches deinen Code besser lesbar machen kann. Das heißt ja nicht, dass man es auch dann verwenden soll, wenn es keinen Sinn ergibt.

    Ach, und das ist ja nicht das einzige Beispiel gewesen. Ich habe hier einen Webcrawler mit rund 30 Fehlerpfaden, von denen einige kritisch, andere nicht so kritisch sind. Da nicht goto für Sub-Funktionen zu verwenden bringt einen so dermaßen in eine Welt des Schmerzes, dass ich über Alternativen gar nicht erst nachdenken will.

    Andromeda schrieb:

    Der Mensch hat irgendwie einen Hang dazu, alles zu verallgemeinern. Dadurch fühlt er sich schlauer als die anderen. Doch Hinzufügen von Komplexität ist selten gut.

    Kommt darauf an, sage ich. Einige Konzepte von C++ sind definitiv gut gemeint. Aber meines Erachtens wurde versucht, zu viel Kontrolle aus der Hand des Programmierers zu legen.



  • Jetzt stellt sich mir die Frage, ob es nicht leichter ist "gutes" C anstellen von "gutem" C++ zu lernen?

    Ich habe mich ein wenig querbeet dazu eingelesen und mir stellt sich die Frage: Braucht man fest eingebaute Klassen in einer Sprache um jeden Preis, oder reicht es nicht einfach aus mit Strukturen, und Funktionen die damit arbeiten, was zu bauen? Also reicht C nicht völlig aus? Sind die Fehler die mit C gebaut werden schwerer zu finden als die die man mit C++ oft macht? Sind die vielen Präprozessoranweisungen, Callbacks, Voidzeiger und Gotos wirklich soooo übel im Vergleich zu dem was man mit C++ verbocken kann?

    Gibt es überhaupt eine Programmiersprache die man heute wirklich für fast alles empfehlen kann. Ich bin echt total unentschlossen was die Sprache angeht. Soll ich mir das wirklich antun? Habe ich überhaupt eine Chance je C++ richtig zu lernen?


Anmelden zum Antworten