it-swarm.dev

Wann sollte C über C ++ und C ++ über C verwendet werden?

Ich bin seit etwas mehr als einem Jahr in der Informatik eingeführt, und meiner Erfahrung nach scheinen C und C++ beide als "ultraschnelle" Sprachen zu gelten, während andere wie Python) und solche Skriptsprachen werden normalerweise als etwas langsamer angesehen.

Aber ich habe auch viele Fälle gesehen, in denen ein Softwareprojekt oder sogar ein kleines Dateien verschachtelt, 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, einen allgemeinen Eindruck davon zu bekommen, wann es angemessen ist, C über C++ zu verwenden, und wann es besser ist, C++ über C zu verwenden. Abgesehen von den Tatsachen, dass (1) C++ objektorientiert ist, während C ist nicht und (2) die Syntax ist sehr ähnlich, und C++ wurde absichtlich so erstellt, dass es C in vielerlei Hinsicht ähnelt. Ich bin mir nicht sicher, was ihre Unterschiede sind. Es scheint mir, dass sie in vielen Bereichen (fast) perfekt austauschbar sind.

Es wäre also dankbar, wenn jemand die Situation klären könnte! Vielen Dank

164
Dark Templar

Sie wählen C wann

  • sie benötigen einen tragbaren Assembler (was eigentlich C ist), aus welchem ​​Grund auch immer.
  • ihre Plattform bietet kein C++ (ein C-Compiler ist viel einfacher zu implementieren),
  • sie müssen mit anderen Sprachen interagieren, die nur mit C interagieren können (normalerweise der kleinste gemeinsame Nenner auf einer Plattform), und Ihr Code besteht nur aus der Schnittstelle. Es lohnt sich also nicht, eine C-Schnittstelle über C++ - Code zu legen.
  • sie hacken in ein Open Source-Projekt (von denen viele aus verschiedenen Gründen bei C bleiben),
  • sie kennen C++ nicht.

In allen anderen Fällen sollten Sie C++ auswählen.

184
sbi

Es gibt einige Gründe, C zu bevorzugen. Der Hauptgrund ist, dass es tendenziell schwieriger ist, wirklich winzige ausführbare Dateien mit C++ zu erstellen. Bei wirklich kleinen Systemen schreiben Sie ohnehin selten viel Code, und der zusätzliche ROM Speicherplatz, der für C++ anstelle von C benötigt wird, kann erheblich sein.

Ich sollte jedoch auch hinzufügen, dass für wirklich winzige Systeme C aus genau demselben Grund Probleme hat und die Assemblersprache fast die einzig vernünftige Wahl ist. Der Bereich der Systemgrößen, in dem C wirklich Sinn macht, ist recht klein und schrumpft ständig (obwohl ich zugeben werde, ziemlich langsam).

Eine andere Zeit/ein anderer Grund für die Verwendung von C besteht darin, eine Reihe von Funktionen bereitzustellen, an die Sie im Wesentlichen aus jeder anderen Sprache binden können. Sie können diese Funktionen in C++ schreiben, indem Sie sie als extern "C" - Funktionen definieren, aber dies beschränkt diese Funktionen darauf, der Welt ein im Wesentlichen C-Life "Gesicht" zu präsentieren - Klassen, überladene Funktionen, Vorlagen und Elementfunktionen usw. müssen nicht zutreffen. Dies beschränkt die Entwicklung jedoch nicht unbedingt auf C - es ist durchaus sinnvoll, alle Arten von C++ - Funktionen intern zu verwenden, solange die externe Schnittstelle vorhanden ist sieht aus wie C.

Gleichzeitig muss ich sagen, dass die Antworten von @ Toll (für ein offensichtliches Beispiel) in den meisten Punkten fast rückwärts sind. Angemessen geschriebenes C++ ist im Allgemeinen mindestens so schnell wie C und oft mindestens etwas schneller. Die Lesbarkeit ist im Allgemeinen viel besser, schon allein deshalb, weil Sie nicht in einer Lawine des gesamten Codes für selbst die trivialsten Algorithmen und Datenstrukturen, die gesamte Fehlerbehandlung usw. vergraben sind.

Vorlagen "beheben kein Problem mit dem Typensystem der Sprache", sondern fügen lediglich eine Reihe grundlegender Funktionen hinzu, die in C und/oder C++ ohne Vorlagen fast vollständig fehlen. Eine der ursprünglichen Absichten bestand darin, typsichere Behälter vorzusehen, aber in Wirklichkeit gehen sie weit darüber hinaus - im Wesentlichen keine, die C überhaupt bietet.

Automatisierte Tools sind meistens auch ein roter Hering - obwohl das Schreiben eines C-Parsers weniger Arbeit als das Schreiben eines C++ - Parsers ist, macht es in der Realität am Ende praktisch keinen Unterschied. Nur sehr wenige Menschen sind bereit oder in der Lage, für beide einen verwendbaren Parser zu schreiben. Der vernünftige Ausgangspunkt ist daher Clang.

Zufälligerweise werden C und C++ ziemlich häufig zusammen in denselben Projekten verwendet, die von denselben Personen verwaltet werden. Dies ermöglicht etwas, das ansonsten ziemlich selten ist: a Studie , das direkt und objektiv die Wartbarkeit von Code vergleicht, der in den beiden Sprachen von Personen geschrieben wurde, die insgesamt gleich kompetent sind (d. H. Genau die gleichen Personen). 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 verbesserten Softwarequalität und einem geringeren Wartungsaufwand führt ..."

88
Jerry Coffin

Die Unterschiede zwischen C und C++ wurden bereits ausführlich aufgezählt hier . Während Menschen manchmal legitime Gründe für die Wahl des einen oder anderen haben (C++ für OOP oder C, wenn sie das Gefühl haben, dass die zusätzlichen Funktionen von C++ zum Beispiel unerwünschten Overhead verursachen), kommt es meiner Erfahrung nach normalerweise nur vor Was die Leute, die an dieser Datei arbeiten, besser wissen und besser mögen? Ich glaube, dies ist die meiste Zeit der Grund, da es stimmt, dass beide Sprachen leistungskritische Anwendungen angehen.

(Randnotiz: Schauen Sie sich Linus Torvads 'Schimpfen an, warum er C gegenüber C++ bevorzugt. Ich stimme seinen Punkten nicht unbedingt zu, aber es gibt Ihnen einen Einblick, warum Leute C gegenüber C++ wählen könnten. Vielmehr könnten Leute, die ihm zustimmen, aus diesen Gründen C wählen.)

24
Casey Patton

Das Hauptproblem, das in den vorhandenen Antworten (zum Zeitpunkt dieses Beitrags) fehlt, ist die Auswahl.

Es ist einfach. Wenn Sie aus einem völlig irrationalen Grund das Gefühl haben, dass Ausnahmen den Aufwand nicht wert sind, dann Sie müssen 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 der Meinung sind, dass sie unwiderrufliches (und tatsächlich wichtiges, nur bei eingebettetem) ausführbares Aufblähen verursachen, können Sie den ganzen Tag über void * und sizeof (T) verwenden. Nichts zwingt Sie dazu, 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 mehr, ist es eine offensichtliche Tatsache, dass C++ eine überlegene Sprache ist. Anderes vorzuschlagen ist wie zu versuchen, vorzuschlagen, dass 4 größer als 5 ist.

13
DeadMG

Dinge über C++, die C-Programmierer nervös machen

Unter der Haube passiert viel Magie. Konstruktoren, Destruktoren, virtuelle Methoden, Vorlagen usw. können das Schreiben von C++ - Code viel einfacher und schneller machen als den entsprechenden C-Code, sind jedoch schwieriger zu verstehen und zu verstehen (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 Klasse Foo (und alle Klassen, von denen er abhängt) war definiert. Dies ist auch der Grund, warum die Konvention lautet: ++it Anstatt von it++ beim Durchlaufen eines Containers, da postfix ++ beinhaltet oft einen teuren Kopiervorgang.

Je nachdem, was Sie tun, kann ein nicht trivialer Aufwand entstehen, insbesondere bei einfachen Aufgaben. Nehmen Sie die folgenden zwei Programme, das erste in C, das zweite in C++:

/* C version */
#include <stdio.h>
int main(void)
{
  char greeting[] = "Hello, world";
  printf("%s\n", greeting);
  return 0;
}
/* end C version */

/* C++ version */
#include <iostream>
#include <string>
int main(void)
{
  std::string greeting("Hello, world");
  std::cout << greeting << std::endl;
  return 0;
}
/* end C++ version */

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 erstere eine ausführbare Datei mit einer Größe von ~ 9 KB, während die zweite 12,5 KB übernimmt (keine Optimierung) ), fast 28% größer. Der Typ C++ string ist mit IMO viel einfacher zu arbeiten als die C-String-Bibliothek, und C++ - Streams sind viel flexibler und anpassbarer als C-Streams, aber für wirklich hirntoten Code wie diesen sind sie kann den Aufwand nicht wert sein.

C++ ist eine große Sprache im Vergleich zu C mit einer äußerst komplexen Semantik. Es dauert viel länger, C++ zu beherrschen als 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. Keine Begrenzung der Überprüfung von Arrays führt zu viel ausnutzbarem Verhalten (sei es durch die jetzt tote Funktion gets oder durch scanf mit der Funktion %s und %[ Konvertierungsspezifizierer). In C++ erhalten Sie zumindest Container, die Ausnahmen auslösen, wenn Sie versuchen, außerhalb des aktuell definierten Bereichs darauf zuzugreifen. Alles, was C Ihnen gibt, ist (wenn Sie Glück haben) eine Segmentierungsverletzung.

Die Speicherverwaltung in C ist im Vergleich zu den von C++ bereitgestellten Tools sehr arbeitsintensiv und fehleranfällig. Wenn Sie Ihren eigenen Container erstellen, sind Sie dafür verantwortlich, alle Aufrufe malloc und free abzugleichen, sicherzustellen, dass die Zuweisungen erfolgreich sind, und im Fehlerfall alle Teilzuweisungen zurückzusetzen usw. In C++ fügen Sie einfach Elemente zum Container hinzu oder entfernen sie aus dem Container. Wenn es ein Problem gibt, wird eine Ausnahme ausgelöst.

In ähnlicher Weise ist die Fehlerbehandlung in C im Vergleich zu den von C++ bereitgestellten Tools (nämlich Ausnahmen) ein Ärgernis. Was wirklich Spaß macht, ist, wenn Sie eine Menge Speicher zugewiesen und dann in Ihrer Verarbeitung gegen eine Wand gestoßen sind. Wenn Sie sich zurückziehen müssen, müssen Sie diesen Speicher in der richtigen Reihenfolge freigeben. Mit C++ - und RAII-Prinzipien ist dies (relativ) einfach.

Wann verwende ich einen über den anderen?

Wenn das, was Sie schreiben, einfach ist, lesen Sie es/machen Sie es kaputt/entfernen Sie es von der Anwendung, deren Verhalten in Bezug auf Ein- und Ausgaben und Leistung ist wichtig, dann bevorzugen Sie C gegenüber C++. Ansonsten bevorzugen Sie C++

9
John Bode

Bjarne Stroustrup verwaltet ein Liste der Anwendungen und Unternehmen , die C++ verwenden; Sie können über prozedurale vs OOP Programmierung alles, was Sie wollen, streiten, aber Sie können nicht mit Branchenergebnissen in den letzten 20 Jahren streiten.

C++ wird häufig für große, komplexe Projekte mit mehreren Mitarbeitern verwendet, bei denen separate Personen an modularisierten Komponenten arbeiten müssen. Sie können natürlich modularisierten Code in C erstellen und verwalten, aber die inhärente OOP - Natur von C++ führt zu einer überlegenen Modularisierung, Testbarkeit und Wiederverwendung von Code.

Die C++ - Standardbibliothek (STL) mit nur 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.

Ich würde sagen, dass der Hauptgrund, warum ich C anstelle von C++ wählen würde, nur dann ist, wenn ich auf "Es muss 1000% stabil sein" der NASA zurückgreifen müsste.

C++ ist ~ 99% C, wenn wir uns die Leistung ansehen, und es ist viel produktiver. Selbst wenn Sie in C Code schreiben, der schneller als C++ ist (Sie können auch eine Teilmenge von C++ ohne Ausnahmen, virtuell, Streaming, Abstraktionen usw. verwenden, aber das ist im Grunde C), ist es an der Zeit, alles 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 opfern, weil STL-Algorithmen von Expertengruppen geschrieben wurden und Sie wahrscheinlich nicht in allem ein Experte sind.

Auf der anderen Seite 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 wohl 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> wird der Referenzzähler überlaufen, wird eine Ausnahme ausgelöst? Solche Dinge sind nicht cool, wenn Shuttle wieder in die Atmosphäre muss, zumindest denke ich.

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 leicht in Lecks gerät. Viele hochrangige Mitarbeiter haben diese Meinung geäußert.

9
Coder

C ist eine portable Assembly mit besserer Syntax, die dem Programmierer die volle Kontrolle über alles. gibt.

C++ hingegen macht eine Menge funky Magie (virtuelle Funktionen, Überladung, automatische Konvertierung usw. usw.), die möglicherweise nicht wünschenswert ist, wenn Sie sicherstellen möchten, dass Sie:

  • verwenden Sie nicht mehr Speicher als Sie möchten
  • greifen Sie nicht ohne weiteres auf Speicherseiten zu (die vtable kann überall sein)
  • rufen Sie nicht versehentlich zu viel Code auf

Und Sie möchten etwas wirklich Einfaches, mit dem Sie arbeiten können, 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 die JSF-Codierungsrichtlinien darüber, woran Sie denken müssen, wenn Sie C++ für die militärische Avionikkontrolle schreiben. Es gibt dort viele Fallen, die Sie beachten 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 würde zwar C++ bevorzugen, aber ich mag es auch nicht ...... ;-P)

6
Macke

(vorausgesetzt, Sie sind mit beiden Sprachen gleichermaßen vertraut)

Gehen Sie mit C++, es sei denn, es gibt keinen C++ - Compiler für Ihre Plattform. Sie können C++ - Code ohne einen Teil der Sprache schreiben, den Sie nicht mögen (keine Klassen, Ausnahmen, virtuelle Vererbung, unabhängig von den persönlichen Einschränkungen, die Sie anwenden möchten), und dann zu einem späteren Zeitpunkt, wenn Sie möchten, dass Sie einen Teil davon möchten diese Funktionen schließlich können Sie sie dann einfach verwenden. 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 später für eine Erweiterung offen lassen.

2
anon

Beide Sprachen sind ausgezeichnet. Ich denke, eine Reihe von Postern hat die Stärken und die verschiedenen Verwendungszwecke für jedes Poster detailliert beschrieben. Ich werde einfach Folgendes hinzufügen:

Ich sehe die C-Sprache in 4 Bereichen perfekt: 1) Ich denke, sie ist die beste Sprache, wenn Sie zum ersten Mal irgendeine Art von Programmierung lernen [kombiniert mit etwas Zusammenbau und Kenntnissen des Maschinencodes], 2) sie eignet sich hervorragend zum Schreiben von Treibern, 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ßprojekten, GUI-basierter Software, Spielesoftware und anderen Arten grafisch intensiver Software arbeiten, ist C++, Java oder sogar Objective-C die beste Wahl. Es gibt jedoch viele Befehlszeilenprogramme oder Systemsoftware, in denen C++ möglicherweise genauso gut oder besser als C ist.

1
Jonathan

C ist wahrscheinlich C++ vorzuziehen, wenn der C-Code generiert wird (z. B. in Implementierungen übergeordneter 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 (my - SCHMELZE Tool gibt C++ - Code aus, aber ich werde diesen Code nicht als echten C++ - Code bezeichnen, er verwendet nur sehr wenige C++ - Funktionen).

C-Code ist auch einfacher halbautomatisch zu 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.

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 Namensveränderungen, sodass Benutzer einer Bibliothek, die mit einem anderen Compiler als der Bibliothek kompiliert wurde, möglicherweise Probleme bei der Verwendung haben. Bei C ist die binäre Schnittstelle normalerweise 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 normalerweise Sun Studio, da es insbesondere auf Sparc-Systemen häufig bessere Ergebnisse liefert. Man Open Source-Projekte werden jedoch mit gcc-spezifischem Code geschrieben. Es kann ziemlich schmerzhaft sein, diese zusammenzubringen.

0
johannes