Ich bin jetzt seit etwas mehr als einem Jahr mit der Informatik vertraut, und meiner Erfahrung nach scheinen C und C ++ beide als "ultraschnelle" Sprachen zu gelten, während andere wie Python und solche Skriptsprachen normalerweise als etwas langsamer gelten .
Aber ich habe auch viele Fälle gesehen, in denen ein Softwareprojekt oder sogar ein kleines Projekt Dateien verschachtelte, in denen eine bestimmte Anzahl n dieser Dateien in C und eine bestimmte Anzahl m dieser Dateien in C ++ geschrieben wurden.
(Mir ist auch aufgefallen, dass C ++ - Dateien fast immer entsprechende Header haben, während C-Dateien nicht so sehr). Mein Hauptanliegen ist es jedoch, ein allgemeines Gespür dafür zu entwickeln, wann es angebracht ist, C über C ++ zu verwenden, und wann es besser ist, C ++ über C zu verwenden C ist nicht, und (2) die Syntax ist sehr ähnlich, und C ++ wurde absichtlich erstellt, um C in vielerlei Hinsicht zu ähneln. Ich bin nicht sicher, was ihre Unterschiede sind. Es scheint mir, dass sie in vielen Bereichen (fast) perfekt austauschbar sind.
Es wäre also sehr dankbar, wenn jemand die Situation klären könnte! Vielen Dank
virtual
einige andere Funktionen zu vermeiden, die Optimierungen verhindern, aber z. B. sind Nicht-virtual
Klassen nicht von Natur aus ineffizient, und Vorlagen sind a leistungsfähiges Abstraktionswerkzeug, das tatsächlich zu mehr Effizienz führen kann - zBqsort
vsstd::sort
). (2) Hohe Wichtigkeit der Korrektheit ist ein Grund, C ++ (Typensicherheit,const
Ness,private
RAII, um das Ressourcenmanagement überschaubar zu machen, etc.) über C zu verwenden. Oder verwenden Sie Ada oder etwas anderes .void*
in einen anderen Zeigertyp in C - Code, es ist sehr störend und typisch für Menschen , die C nicht wissenAntworten:
Sie wählen C wann
In allen anderen Fällen sollten Sie C ++ auswählen.
quelle
Es gibt einige Gründe, C zu bevorzugen. Der Hauptgrund ist, dass es schwieriger ist, wirklich winzige ausführbare Dateien mit C ++ zu erstellen. Bei wirklich kleinen Systemen schreiben Sie sowieso selten viel Code, und der zusätzliche ROM-Speicherplatz, der für C ++ und nicht für C benötigt wird, kann erheblich sein.
Ich sollte jedoch auch hinzufügen, dass C bei wirklich kleinen Systemen aus genau demselben Grund Probleme hat und die Assemblersprache fast die einzige vernünftige Wahl ist. Der Bereich der Systemgrößen, innerhalb dessen C wirklich Sinn macht, ist recht klein und schrumpft ständig (obwohl ich zugeben werde, ziemlich langsam).
Ein weiterer Grund für die Verwendung von C besteht darin, eine Reihe von Funktionen bereitzustellen, an die Sie sich aus praktisch jeder anderen Sprache binden können. Sie können diese Funktionen in C ++ schreiben, indem Sie sie als
extern "C"
Funktionen definieren. Dadurch werden diese Funktionen jedoch darauf beschränkt, den Weltklassen ein im Wesentlichen C-life-Gesicht zu präsentieren - Klassen, überladene Funktionen, Vorlagen und Memberfunktionen usw. müssen dies nicht tun anwenden. Dies beschränkt die Entwicklung jedoch nicht unbedingt auf C - es ist durchaus sinnvoll, alle C ++ - Funktionen intern zu verwenden , solange die externe Schnittstelle wie C aussieht.Gleichzeitig muss ich sagen, dass die Antworten von @ Toll (für ein offensichtliches Beispiel) in den meisten Hinsichten fast rückwärts sind. Vernünftigerweise geschriebenes C ++ ist in der Regel mindestens so schnell wie C und häufig mindestens etwas schneller. Die Lesbarkeit ist in der Regel viel besser, schon allein deshalb, weil Sie nicht in eine Lawine des gesamten Codes für die einfachsten Algorithmen und Datenstrukturen, die gesamte Fehlerbehandlung usw. vergraben werden.
Templates "beheben kein Problem mit dem Typensystem der Sprache", sondern fügen einfach eine Reihe grundlegender Funktionen hinzu, die in C und / oder C ++ ohne Templates fast nicht vorhanden sind. Eine der ursprünglichen Absichten war es, typsichere Container bereitzustellen, aber in Wirklichkeit gehen sie weit darüber hinaus - im Wesentlichen keine, die C überhaupt bereitstellt.
Automatisierte Tools sind meistens auch ein roter Faden - während das Schreiben eines C-Parsers weniger Arbeit kostet als das Schreiben eines C ++ - Parsers, macht es letztendlich praktisch keinen Unterschied. Nur sehr wenige Leute sind bereit oder in der Lage, einen verwendbaren Parser für einen der beiden zu schreiben. Angemessener Ausgangspunkt ist also Clang.
Zufällig werden C und C ++ ziemlich häufig zusammen in denselben Projekten verwendet, die von denselben Personen verwaltet werden. Dies ermöglicht etwas, was ansonsten ziemlich selten ist: eine Studie , die die Wartbarkeit von Code, der in zwei Sprachen von Personen geschrieben wurde, die insgesamt gleich kompetent sind (dh genau dieselben Personen), direkt und objektiv vergleicht. Zumindest in der verknüpften Studie war eine Schlussfolgerung klar und eindeutig: "Wir haben festgestellt, dass die Verwendung von C ++ anstelle von C zu einer Verbesserung der Softwarequalität und einem geringeren Wartungsaufwand führt ..."
quelle
Die Unterschiede zwischen C und C ++ wurden bereits ausführlich aufgezählt wurden hier . Während Menschen manchmal legitime Gründe haben, sich für das eine oder andere zu entscheiden (C ++ für OOP oder C, wenn sie der Meinung sind, dass die zusätzlichen Funktionen von C ++ beispielsweise unerwünschten Overhead verursachen), kommt es meiner Erfahrung nach in der Regel nur auf die Präferenz an. Was wissen die Leute, die an dieser Datei arbeiten, besser und mögen es besser? Ich glaube, dies ist der Grund für die meiste Zeit, da beide Sprachen leistungskritische Anwendungen angehen.
( Randbemerkung : Sehen Sie sich an, warum Linus Torvads C gegenüber C ++ bevorzugt. Ich bin nicht unbedingt mit seinen Argumenten einverstanden, aber es gibt Ihnen einen Einblick, warum Menschen C gegenüber C ++ wählen. Vielmehr Menschen, die ihm zustimmen könnte aus diesen Gründen C wählen.)
quelle
-1
für Linus 'Schimpfen. : - {Das Hauptproblem, das in den vorhandenen Antworten (zum Zeitpunkt der Veröffentlichung) fehlt, ist die Wahl.
Es ist einfach. Wenn Sie aus einem völlig irrationalen Grund der Meinung sind, dass Ausnahmen den Aufwand nicht wert sind, müssen Sie sie nicht verwenden . Sie können weiterhin Vorlagen, RAII und die Standardbibliothek haben und niemals einen einzigen "Wurf" schreiben. Gleiches gilt für Vorlagen. Wenn Sie aus irgendeinem Grund das Gefühl haben, dass sie unwiderrufliches (und eigentlich wichtiges, nur eingebettetes) Aufblähen verursachen, können Sie überraschenderweise auch void * und sizeof (T) den ganzen Tag verwenden. Nichts zwingt Sie, eine der C ++ - Funktionen über C zu verwenden.
Aus diesem Grund ist C ++ eine von Natur aus überlegene Sprache. Sie können die gewünschten Funktionen auswählen und auf die Programmierung im C-Stil zurückgreifen, wenn Sie eine bestimmte Funktion nicht mögen. Angesichts der Tatsache, dass C ++ alles ist, was C ist, und darüber hinaus, ist es eine offensichtliche Tatsache, dass C ++ eine überlegene Sprache ist. Andernfalls vorzuschlagen ist wie der Versuch, vorzuschlagen, dass 4 größer als 5 ist.
quelle
Dinge über C ++, die C-Programmierer nervös machen
Unter der Motorhaube geschieht viel Magie. Konstruktoren, Destruktoren, virtuelle Methoden, Vorlagen usw. können dazu führen, dass C ++ - Code viel einfacher und schneller zu schreiben ist als der entsprechende C - Code, jedoch schwieriger zu verstehen und zu durchdenken (je nachdem, wie gut Sie C ++ und die damit verbundenen Konventionen kennen). Etwas so Einfaches wie
Foo newFoo;
kann eine Menge Code aufrufen , abhängig davon, wie der Konstruktor für die KlasseFoo
(und alle Klassen, von denen er abhängt) definiert wurde. Dies ist auch der Grund, warum die Konvention lautet,++it
stattit++
durch einen Container zu iterieren, da Postfix++
oft einen teuren Kopiervorgang beinhaltet.Je nachdem, was Sie gerade tun, kann es zu nicht trivialem Overhead kommen, insbesondere bei einfachen Aufgaben. Nehmen Sie die folgenden zwei Programme, das erste in C, das zweite in C ++:
Identisches Verhalten, kein großer Unterschied in Bezug auf die Quelle, aber auf der SLES 10-Box, an der ich mit gcc 4.1.2 arbeite, generiert die erste eine ausführbare Datei mit einer Größe von ~ 9 KB, während die zweite 12,5 KB überschreitet (keine Optimierung) ), fast 28% größer. Der C ++ -
string
Typ ist viel einfacher mit IMO zu arbeiten als die C-Zeichenfolgenbibliothek, und C ++ - Streams sind viel flexibler und anpassbarer als C-Streams, aber für wirklich hirntoten Code wie diesen lohnt sich der Aufwand möglicherweise nicht.C ++ ist im Vergleich zu C eine riesige Sprache mit extrem komplexer Semantik. Das Erlernen von C ++ dauert viel länger als das von C, was bedeutet, dass viele Leute, die behaupten, C ++ zu kennen, es nicht so gut kennen, wie sie denken.
Dinge über C, die C ++ - Programmierer nervös machen
C ist keine sichere Programmiersprache. Die Überprüfung von Arrays ohne Einschränkungen führt zu einer Vielzahl von ausnutzbaren Verhaltensweisen (sei es durch die
gets
Funktion now-dead oder durchscanf
die Spezifizierer%s
and und%[
conversion). Zumindest in C ++ gibt es Container, die Ausnahmen auslösen, wenn Sie versuchen, außerhalb des aktuell definierten Bereichs zuzugreifen. Alles, was C gibt, ist (wenn Sie Glück haben) eine Verletzung der Segmentierung.Die Speicherverwaltung in C ist sehr arbeitsintensiv und fehleranfällig im Vergleich zu den von C ++ bereitgestellten Tools. Wenn Sie einen eigenen Container erstellen, müssen Sie alle Aufrufe
malloc
und abgleichenfree
, sicherstellen, dass die Zuweisungen erfolgreich sind, und alle Teilzuweisungen im Fehlerfall zurücksetzen. In C ++ fügen Sie einfach Elemente zu oder hinzu Gegenstände aus dem Behälter entfernen. Wenn es ein Problem gibt, wird eine Ausnahme ausgelöst.In ähnlicher Weise ist die Fehlerbehandlung in C im Vergleich zu den Tools, die C ++ bereitstellt, ein Nervenkitzel (nämlich Ausnahmen). Was wirklich Spaß macht, ist, wenn Sie eine Menge Speicher zugewiesen haben und dann in Ihrer Verarbeitung an eine Wand stoßen. Wenn Sie zurücktreten müssen, müssen Sie diesen Speicher in der richtigen Reihenfolge freigeben. Mit C ++ und RAII ist dies (relativ) einfach zu bewerkstelligen.
Also, wann verwende ich eins übereinander?
Wenn das, was Sie schreiben, nicht einfach ist, lesen Sie es, spielen Sie damit herum, und entfernen Sie die Anwendung, deren Verhalten in Bezug auf Ein- und Ausgaben und Leistungsaspekte klar beschrieben werden kann. Dann ziehen Sie C C ++ vor. Ansonsten lieber C ++
quelle
Bjarne Stroustrup führt eine Liste der Anwendungen und Unternehmen , die C ++ verwenden. Sie können sich über verfahrenstechnische vs. OOP-Programmierung streiten, was Sie wollen, aber Sie können sich nicht mit den Branchenergebnissen der letzten 20 Jahre streiten.
C ++ wird häufig für komplexe Großprojekte mit mehreren Mitarbeitern verwendet , bei denen separate Personen an modularisierten Komponenten arbeiten müssen. Sie können modularisierten Code natürlich in C erstellen und verwalten, aber die inhärente OOP-Eigenschaft von C ++ führt zu überlegener Modularisierung, Testbarkeit und Wiederverwendung von Code.
Die C ++ - Standardbibliothek (STL) allein mit Vektoren und Karten ist Grund genug, C ++ zu verwenden.
C wird üblicherweise für eingebettete Systeme verwendet.
Ich persönlich würde C nur verwenden, wenn es eine Bibliothek gibt, die nur eine C-API hat.
quelle
Ich würde sagen, dass der Hauptgrund, warum ich C gegenüber C ++ wählen würde, nur dann ist, wenn ich auf NASA-Sachen wie "It this HAS TO BE 1000% stable" zurückgreifen müsste.
C ++ ist ~ 99% C, wenn wir die Leistung betrachten, und es ist viel produktiver. Selbst in C können Sie Code schreiben, der schneller ist als C ++ (Sie können auch eine Teilmenge von C ++ ohne Ausnahmen, virtuell, Streaming, Abstraktionen usw. verwenden, aber das ist im Grunde genommen C), die Zeit, um jedes verdammte Ding zu optimieren Während STL getestet wird und dies bereits tut, würde es Sie mehr kosten als den winzigen Leistungsgewinn, den Sie erzielen könnten, oder Sie würden Opfer bringen, da STL-Algorithmen von Expertengruppen geschrieben wurden und Sie wahrscheinlich nicht in allen Dingen ein Experte sind.
Andererseits hat C ++ eine Menge Abstraktionen. Wenn sie unter Umständen auslaufen, geraten Sie in Schwierigkeiten. Und es gibt nur wenige Leute, die 100% der C ++ - Fallstricke kennen, während es vermutlich mehr gibt, die alle C-Fallstricke kennen. Daher ist es in C viel einfacher, eine Lösung zu schreiben, bei der jeder Schritt von allen Mitgliedern eines Teams vollständig verstanden wird.
Beispiel: Wissen Sie, wann
shared_ptr<smthn>
der Referenzzähler überläuft, wird eine Ausnahme ausgelöst? Solche Dinge sind nicht cool, wenn Shuttle die Atmosphäre wieder betreten muss, denke ich zumindest.Außerdem ist die Ausnahmebehandlung im Vergleich zu Fehlercodes sehr, sehr schwierig. Es ist schwer zu erkennen, ob die Klasse zu 100% ausnahmesicher ist und es leicht ist, auf Lecks zu stoßen. Viele hochrangige Vertreter haben diese Meinung geäußert.
quelle
std::string
und ähnlichen Abstraktionen ? Haben Sie jemals versucht, eine Plattform anzugeben, aufshared_ptr
der der Zähler überlaufen würde? Das wäre eine verdammt lustige Plattform. Und wenn Sie der Meinung sind, dass die Behandlung von Ausnahmen schwierig ist, sollten Sie sich einen Teil des C-Codes ansehen, der bei jedem Funktionsaufruf nach möglichen Fehlern sucht. (Ein solcher Code ist schwer zu bekommen, ich gebe zu, aber dies ist nur ein noch stärkeres Argument gegen Ihre Aussage.) Entschuldigung, aber das sind wirklich Rinder-Exkremente.std::string
wenn Sie keine dynamische Zuordnung möchten. Du würdest benutzenstd::basic_string<char, std::char_traits<char>, some_allocator_here>
.C ist eine portable Assembly mit besserer Syntax, die dem Programmierer die volle Kontrolle über alles gibt .
C ++ hingegen macht eine Menge Funky Magic (virtuelle Funktionen, Überladung, automatische Konvertierung usw. usw.), was möglicherweise nicht wünschenswert ist, wenn Sie sicherstellen möchten, dass Sie:
Und möchten Sie etwas wirklich Einfaches, da Sie sich auf Leistung konzentrieren.
Es hat einfach keine Überraschungen und das ist sehr wertvoll.
Wenn Sie möchten (und ich empfehle es), lesen Sie in den JSF-Codierungsrichtlinien nach, worauf Sie beim Schreiben von C ++ für die militärische Avioniksteuerung achten müssen. Es gibt dort eine Menge Fallen, auf die Sie achten müssen, und es kann Sie auffangen. Bjarne war Teil dieses Dokuments, also weiß er, worum es geht.
Außerdem kompiliert C wie ein verbrühter Troll, der vom Blitz getroffen wird. C ++, OTOH, wurde wahrscheinlich von denselben Personen gesponsert, die in SSD-Unternehmen investiert haben. :)
(Ich persönlich bevorzuge C ++, aber ich mag es auch nicht ...... ;-P)
quelle
int
64 Bit ist, muss man mindestens einen Operanden umwandeln,uint64_t
um Undefiniertes Verhalten zu verhindern, aber auf 64 Bit umwandeln zu müssen , um ein 32-Bit-Ergebnis zu berechnen, ist - gelinde gesagt - "überraschend".(vorausgesetzt du kennst beide Sprachen gleich gut)
Fahren Sie mit C ++ fort, es sei denn, es gibt keinen C ++ - Compiler für Ihre Plattform. Sie können C ++ - Code ohne einen Teil der Sprache schreiben, die Sie nicht mögen (keine Klassen, Ausnahmen, virtuelle Vererbung, beliebige persönliche Einschränkungen, die Sie anwenden möchten), und dann irgendwann in der Zukunft, wenn Sie dies wünschen Diese Funktionen können Sie dann ganz einfach nutzen. Nichts in C ++ hindert Sie daran, Code im C-Stil zu schreiben.
Es gibt keinen Grund, C anstelle von C ++ zu wählen, vorausgesetzt, Ihre Plattform verfügt über einen C ++ - Compiler. Sie können sich einfach auf die Teilmenge der Sprache beschränken, die Sie heute möchten, und die Tür für eine spätere Erweiterung offen lassen.
quelle
Beide Sprachen sind ausgezeichnet. Ich denke, eine Reihe von Postern hat die Stärken und die verschiedenen Verwendungszwecke für jeden genau beschrieben. Ich füge einfach Folgendes hinzu:
Ich sehe die C-Sprache in 4 Bereichen als perfekt an: 1) Ich denke, dass es die beste Sprache ist, wenn man zum ersten Mal irgendeine Art von Programmierung lernt [kombiniert mit etwas Assembler- und Maschinencode-Kenntnissen], 2) es ist großartig, Treiber zu schreiben, 3) eingebettet Software und 4) Systemsoftware auf der untersten Ebene.
C ++ ist eine objektorientierte Sprache, kann aber auch prozedural sein (sehr ähnlich wie C). Wenn Sie an großen Projekten, GUI-basierter Software, Spielesoftware und anderen Arten von grafisch intensiver Software arbeiten, dann ist C ++, Java oder sogar Objective-C für mich die beste Wahl. Es gibt jedoch viele Befehlszeilenprogramme oder Systemsoftware, in denen C ++ möglicherweise genauso gut oder besser als C ist.
quelle
Meiner Meinung nach fehlt in dieser Diskussion ein Punkt: In C ist es einfacher, eine stabile binäre Schnittstelle aus einer Bibliothek bereitzustellen. Sowohl für die Verwendung mit anderen Sprachen als auch mit C ++.
In C ++ verwenden verschiedene Compiler unterschiedliche Namensverwaltungen, sodass es bei Verbrauchern einer Bibliothek, die mit einem anderen Compiler als der Bibliothek kompiliert wurde, zu Problemen bei der Verwendung kommen kann. Mit C ist die Binärschnittstelle in der Regel für die Plattform standardisiert.
Ich weiß, dass Compiler heutzutage oft Schalter haben, um gcc-kompatible Dinge zu produzieren, aber das hilft nicht immer.
Ich beobachte dies relativ oft unter Solaris. Die Distribution und verschiedene Softwareanbieter verwenden Sun Studio in der Regel, da es insbesondere auf Sparc-Systemen häufig bessere Ergebnisse liefert. Open Source-Projekte werden jedoch mit gcc-spezifischem Code geschrieben. Es kann ziemlich schmerzhaft sein, wenn jemand zusammenarbeitet.
quelle
C ist wahrscheinlich C ++ vorzuziehen, wenn der C-Code generiert wird (z. B. in Implementierungen von höheren Sprachen). Zum Beispiel gibt es mehrere Lisp-ähnliche Compiler, die C-Code ausgeben (z. B. Chicken , Scheme48 ...), aber ich kenne keinen, der echten C ++ - Code ausgibt (mein MELT- Tool gibt C ++ - Code aus, aber ich bezeichne diesen Code nicht als echt C ++ - Code, es werden nur sehr wenige C ++ - Funktionen verwendet.
C-Code lässt sich auch leichter halbautomatisch beweisen. Statische Analysatoren wie Frama-C (bei denen Sie Ihren C-Code mit ACSL-Kommentaren versehen, um den Beweisgrund für Ihren Code zu ermitteln) sind für C verfügbar, für C ++ 11 jedoch nicht so häufig.
quelle