Wie lernt man gutes C++ zu schreiben?
-
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,
gotoist 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.
-
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 Fuck), 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 blutenaber 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
gotoein 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
gotofü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?
-
GoodCpp schrieb:
Jetzt stellt sich mir die Frage, ob es nicht leichter ist "gutes" C anstellen von "gutem" C++ zu lernen?
Persönliche Meinung: Ja.
Aber: ich habe irgendwann aufgegeben, C++ zu lernen, ich bin also möglicherweise nicht qualifiziert dafür, darüber zu schreiben. Auf der anderen Seite habe ich bei C nicht aufgegeben ...
GoodCpp schrieb:
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?
Das kommt darauf an, was du machen willst. Es gibt ein paar Bibliotheken da draußen, die nur ein C++-Interface exportieren, das kannst du dann nur über ekeligen Glue-Code ans Laufen bekommen. Habe ich mal gemacht, als Spaßprojekt für die Irrlicht-Engine.

Aber an sich reicht C so für alles aus, was du machen willst. Manchmal sogar logischer als in C++. In C hast du einfach mehr Kontrolle über das, was du machen willst, während dir diese Kontrolle in C++ abgenommen wird. Das ist nicht notwendigerweise etwas schlechtes, weil da draußen auch nicht die besten Leute programmieren. C fängt da halt nichts ab, C++ schon. Dafür fängt C halt auch nichts ab, wenn du gerade genialen Code schreibst, der in C++ über zig Klassen gelöst werden würde.
Aber auf der anderen Seite - wie wahrscheinlich ist es, dass du genialen Code schreibst?

GoodCpp schrieb:
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?
Da kannst du genauso fragen, ob es nicht ein Werkzeug gibt, welches bei der Schreinerei fast alles machen kann. Nein, gibt es nicht. Jede Sprache hat Vor- und Nachteile.
Und ich kann dir nicht sagen, welche Programmiersprache die beste ist. Weil es kein "Bestes" gibt.
Aber vielleicht hilft dir das hier bei der Entscheidung. Vielleicht solltest du dich auch gar nicht festlegen, erst mal ein bisschen Python oder Perl lernen. Ein Gespür dafür bekommen, was Programmieren eigentlich bedeutet. Später kannst du dann immer noch C oder C++ in Angriff nehmen.
-
manni66 schrieb:
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 ...
GoodCpp schrieb:
Ist das wirklich so heftig?
Ja
GoodCpp schrieb:
Wenn dem so wäre, dürften nur extrem wenige gutes C++ beherrschen ...
Ja
GoodCpp schrieb:
... und das wäre ein Desaster für so ziemlich jedes C++-Projekt da draußen.
Ja ...
na ja - nicht ganz. IMHO haben viele Leute in den vergangenen Jahrzehnten gelernt, wie man auch größere Software-Projekte stemmt. Und auch viele Entwickler haben 'ihren Stil' gefunden, was vielleicht nicht das schönste und modernste C++ ist, aber einfach funktioniert und einigermaßen sicher und wirtschaftlich ist.
GoodCpp schrieb:
Also jetzt mal im ernst. Wenn jemand schon programmieren gelernt hat, welche Zeit sollte er mindestens einplanen um guten C++ zu beherrschen?
ca. 10 Jahre - so wie bei den meisten Dingen, für die man wirklich Kompetenz entwickeln will - siehe http://www.purl.org/stefan_ram/html/21-tage.
Wobei es IMHO extrem hilfreich ist, wenn man ein Talent für Mathematik hat! Das gilt für Programmieren im Allgemeinen und für C++ erst recht.
Umgekehrt wird auch ein Schuh draus. Wenn Du Dich mit Mathe wirklich schwer tust, wirst Du nie gute C++-Programme schreiben können (ist meine persönliche Meinung).Gruß
Werner