C hat den Hauptvorteil, dass Sie nur sehen können, was wirklich los ist, wenn Sie sich einen Code ansehen (ja, Präprozessor: Kompilieren Sie mit -E und dann sehen Sie es). Etwas, das viel zu oft nicht stimmt, wenn man sich C ++ - Code ansieht. Dort haben Sie Konstruktoren und Destruktoren, die implizit basierend auf dem Umfang oder aufgrund von Zuweisungen aufgerufen werden. Sie haben eine Operatorüberladung, die ein überraschendes Verhalten aufweisen kann, selbst wenn sie nicht stark missbraucht wird. Ich gebe zu, dass ich ein Kontrollfreak bin, aber ich bin zu dem Schluss gekommen, dass dies keine so schlechte Angewohnheit für einen Softwareentwickler ist, der zuverlässige Software schreiben möchte. Ich möchte nur eine faire Chance haben zu sagen, dass meine Software genau das tut, was sie tun soll, und gleichzeitig kein schlechtes Gefühl im Magen hat, weil ich weiß, dass es immer noch so viele Fehler geben kann, dass ich es nicht tun würde. '
C ++ hat auch Vorlagen. Ich hasse und liebe sie, aber wenn jemand sagt, dass er oder sie sie vollständig versteht, nenne ich ihn / sie einen Lügner! Dies schließt sowohl die Compiler-Autoren als auch die Leute ein, die an der Definition des Standards beteiligt sind (was offensichtlich wird, wenn Sie versuchen, ihn zu lesen). Es gibt so viele absurd irreführende Eckfälle, dass es einfach nicht möglich ist, sie alle zu berücksichtigen, während Sie tatsächlichen Code schreiben. Ich liebe C ++ - Vorlagen wegen ihrer Leistungsfähigkeit. Es ist wirklich erstaunlich, was man mit ihnen machen kann, aber sie können auch zu den seltsamsten und am schwersten zu findenden Fehlern führen, die man sich (nicht) vorstellen kann. Und diese Fehler treten tatsächlich auf und nicht einmal selten. Das Lesen der Regeln zum Auflösen von Vorlagen in C ++ ARM lässt meinen Kopf fast explodieren. Und es gibt mir das schlechte Gefühl, Zeit zu verschwenden, wenn ich mehrere 1000 Zeichen lange Compiler-Fehlermeldungen lesen muss, für die ich bereits 10 Minuten oder mehr benötige, um zu verstehen, was der Compiler tatsächlich von mir will. In typischem C ++ (Bibliotheks-) Code finden Sie häufig auch viel Code in Header-Dateien, um bestimmte Vorlagen zu ermöglichen, was wiederum das Kompilieren / Ausführen von Zyklen selbst auf schnellen Computern schmerzhaft verlangsamt und das Neukompilieren großer Teile des Codes erfordert, wenn Sie etwas ändern Dort.
C ++ hat auch die const-Falle. Sie vermeiden entweder const für alle außer den trivialsten Anwendungsfällen, oder Sie müssen es früher oder später wegwerfen oder große Teile der Codebasis umgestalten, wenn sie sich weiterentwickelt, insbesondere wenn Sie ein schönes und flexibles OO-Design entwickeln möchten.
C ++ hat eine stärkere Typisierung als C, was großartig ist, aber manchmal habe ich das Gefühl, ich füttere einen Tamagotchi, wenn ich versuche, C ++ - Code zu kompilieren. Ein großer Teil der Warnungen und Fehler, die ich normalerweise davon bekomme, ist nicht wirklich, dass ich etwas tue, das nicht funktioniert, sondern nur Dinge, die der Compiler nicht so oder so machen möchte, ohne hier und da einige zusätzliche Schlüsselwörter zu verwenden Dort.
Dies sind nur einige der Gründe, warum ich C ++ für Software nicht mag, die ich alleine schreibe, nur mit einigen angeblich robusten externen Bibliotheken. Der wahre Horror beginnt, wenn Sie Code in Teams mit anderen Personen schreiben. Es ist fast egal, ob sie sehr clevere C ++ - Hacker oder naive Anfänger sind. Jeder macht Fehler, aber C ++ macht es absichtlich schwierig, sie zu finden und noch schwieriger, sie zu erkennen, bevor sie auftreten.
Mit C ++ gehen Sie einfach verloren, ohne ständig einen Debugger zu verwenden, aber ich möchte die Richtigkeit meines Codes in meinem Kopf überprüfen können und mich nicht auf einen Debugger verlassen müssen, um meinen Code auf Pfaden zu finden, die ich nie erwartet hätte. Ich versuche tatsächlich, meinen gesamten Code in meinem Kopf auszuführen und alle Zweige zu übernehmen, auch in Unterprogrammen usw., und nur gelegentlich einen Debugger zu verwenden, um zu sehen, wie gut er durch alle gemütlichen Orte läuft, die ich dafür vorbereitet habe. Es ist einfach unmöglich, so viele Testfälle zu schreiben und auszuführen, dass alle Codepfade in allen Kombinationen mit allen möglichen seltsamen Eingabedaten verwendet wurden. Sie kennen die Fehler in C ++ - Programmen möglicherweise nicht, aber das bedeutet nicht, dass sie nicht vorhanden sind. Je größer ein C ++ - Projekt wird, desto geringer wird mein Vertrauen, dass es nicht viele unentdeckte Fehler gibt, selbst wenn es mit allen verfügbaren Testdaten perfekt läuft. Schließlich mache ich es kaputt und beginne neu mit einer anderen Sprache oder einer Kombination anderer Sprachen.
Ich könnte weitermachen, aber ich glaube, ich habe meinen Standpunkt inzwischen klargestellt. All dies hat mich beim Programmieren in C ++ unproduktiv gemacht und das Vertrauen in die Richtigkeit meines eigenen Codes verloren, was bedeutet, dass ich ihn nicht mehr verwenden werde, während ich immer noch C-Code verwende und mich darauf verlasse, den ich mehr als 20 geschrieben habe Jahre zuvor. Vielleicht liegt es einfach daran, dass ich kein guter C ++ - Programmierer bin, oder dass ich in C und anderen Sprachen ziemlich gut bin, um zu erkennen, was für ein Lamer ich eigentlich bin, wenn es um C ++ geht, und dass ich es nie vollständig verstehen kann .
Das Leben ist kurz...