Was wären C ++ - Einschränkungen im Vergleich zur C-Sprache? [geschlossen]

116

Im Folgenden sind die Vorteile von C ++ aufgeführt

  • C ++ bietet die spezifischen Funktionen, nach denen sie fragen
  • Ihr C-Compiler ist mit ziemlicher Sicherheit ein C ++ - Compiler, daher gibt es keine Auswirkungen auf die Softwarekosten
  • C ++ ist genauso portabel wie C.
  • C ++ - Code kann genauso effizient sein wie C (oder mehr oder weniger)

Gibt es konkrete Gründe und spezifische Szenarien, in denen C über C ++ verwendet werden muss?

Verweis auf diese Frage: Bibliothek für Generika in C.

Kein Duplikat, da diese Frage nach Sprachbeschränkungen fragt und nicht nach dem Erlernen einer Sprache gegenüber einer anderen.

Peter Kirkhams Beitrag war für mich der informativste, insbesondere in Bezug auf C99-Themen, die ich nicht berücksichtigt hatte, also habe ich ihn akzeptiert. Vielen Dank an alle anderen, die teilgenommen haben.

anon
quelle
12
Dabei spielt es keine Rolle , ob diese Frage soll argumentative sein oder nicht, ist es immer noch. Die Wahl der Sprache für ein Projekt ist genau das: eine Wahl.
Bombe
7
@bombe sollen wir nicht darüber diskutieren, wie man fundierte Entscheidungen trifft?
10
Ist es nicht ironisch, wenn Sie C-Programmierern raten, auf C ++ umzusteigen, dass sie für Ihre Idee ungefähr so ​​empfänglich sind, wie Sie es wären, wenn ein C-Programmierer Ihnen sagt, Sie sollten C ++ fallen lassen und zu C wechseln?
Warren P

Antworten:

136

Dies wird durch eine Antwort ausgelöst, die ich auf eine aktuelle Frage gegeben habe, in der nach einer generischen Bibliothek für C gefragt wird. Der Fragesteller gibt ausdrücklich an, dass er C ++ nicht verwenden möchte.

C ist eine vollständige Programmiersprache. C ist keine beliebige Teilmenge von C ++. C ist überhaupt keine Teilmenge von C ++.

Dies ist gültig C:

foo_t* foo = malloc ( sizeof(foo_t) );

Um es als C ++ kompilieren zu können, müssen Sie schreiben:

foo_t* foo = static_cast<foo_t*>( malloc ( sizeof(foo_t) ) );

das ist nicht mehr gültig C. (Sie könnten die Besetzung im C-Stil verwenden. In diesem Fall würde sie in C kompiliert, aber von den meisten C ++ - Codierungsstandards und auch von vielen C-Programmierern gemieden. .


Sie sind nicht dieselbe Sprache, und wenn Sie ein vorhandenes Projekt in C haben, möchten Sie es nicht in eine andere Sprache umschreiben, nur um eine Bibliothek zu verwenden. Sie würden es vorziehen, Bibliotheken zu verwenden, mit denen Sie in der Sprache, in der Sie arbeiten, eine Schnittstelle herstellen können. (In einigen Fällen ist dies mit einigen wenigen möglichextern "C" Wrapper-Funktionen möglich, je nachdem, wie Vorlage / Inline eine C ++ - Bibliothek ist.)

Unter der ersten C - Datei in einem Projekt arbeite ich an, ist es das , was passiert , wenn Sie nur Swap gcc std=c99für g++:

sandiego:$ g++ -g  -O1 -pedantic -mfpmath=sse -DUSE_SSE2 -DUSE_XMM3  -I src/core -L /usr/lib -DARCH=elf64 -D_BSD_SOURCE -DPOSIX -D_ISOC99_SOURCE -D_POSIX_C_SOURCE=200112L -Wall -Wextra -Wwrite-strings -Wredundant-decls -Werror -Isrc  src/core/kin_object.c -c -o obj/kin_object.o | wc -l
In file included from src/core/kin_object.c:22:
src/core/kin_object.h:791:28: error: anonymous variadic macros were introduced in C99
In file included from src/core/kin_object.c:26:
src/core/kin_log.h:42:42: error: anonymous variadic macros were introduced in C99
src/core/kin_log.h:94:29: error: anonymous variadic macros were introduced in C99
...
cc1plus: warnings being treated as errors
src/core/kin_object.c:101: error: ISO C++ does not support the z printf length modifier
..
src/core/kin_object.c:160: error: invalid conversion from void*’ to kin_object_t*’
..
src/core/kin_object.c:227: error: unused parameter restrict
..
src/core/kin_object.c:271: error: ISO C++ does not support the z printf length modifier
src/core/kin_object.c:271: error: ISO C++ does not support the z printf length modifier

Insgesamt 69 Fehlerzeilen, von denen vier ungültige Konvertierungen sind, jedoch hauptsächlich für Funktionen, die in C99, jedoch nicht in C ++ vorhanden sind.

Es ist nicht so, dass ich diese Funktionen zum Spaß benutze. Es würde erhebliche Arbeit erfordern, um es in eine andere Sprache zu portieren.

Es ist also einfach falsch, dies vorzuschlagen

[a] Der C-Compiler ist mit ziemlicher Sicherheit ein C ++ - Compiler, daher gibt es keine Auswirkungen auf die Softwarekosten

Das Portieren von vorhandenem C-Code in die prozedurale Teilmenge von C ++ hat häufig erhebliche Kostenfolgen.

Der Vorschlag , die C ++ std :: queue-Klasse als Antwort auf die Frage zu verwenden, nach einer Bibliotheksimplementierung einer Warteschlange in C zu suchen, ist daher besser als der Vorschlag , das Ziel C zu verwenden und die Java-Klasse java.util.Queue mit JNI aufzurufen. oder 'CPython-Bibliothek aufrufen' - Ziel C ist tatsächlich eine richtige Obermenge von C (einschließlich C99), und Java- und CPython-Bibliotheken können beide direkt von C aus aufgerufen werden, ohne dass nicht verwandter Code in die C ++ - Sprache portiert werden muss.

Natürlich können Sie der C ++ - Bibliothek eine C-Fassade hinzufügen, aber wenn Sie dies tun, unterscheidet sich C ++ nicht von Java oder Python.

Pete Kirkham
quelle
21
Ja. C-artige Besetzung ist durchaus üblich, wenn Sie Malloc verwenden. Wenn Sie malloc verwenden, bleiben Sie innerhalb der c-Teilmenge. Wenn Sie den C ++ - Stil programmieren möchten, verwenden Sie den Operator new und nicht static_cast + malloc.
Suma
33
Zu sagen, dass C keine Teilmenge von C ++ ist, ist unglaublich pedantisch. Sicher, Sie könnten sagen, dass jede Struktur mit einem Mitglied namens "class" nicht kompiliert wird, aber es sind wirklich nur geringfügige Änderungen erforderlich, und die meisten Compiler haben Optionen, um die wenigen C-only-Funktionen zu C ++ hinzuzufügen.
Kaz Dragon
27
Was Ihr Malloc-Beispiel betrifft, würde das Hinzufügen einer Besetzung nicht nur von C ++ - Programmierern, sondern auch (insbesondere) von C-Programmierern gemieden. Es gibt gute Gründe, die Besetzung in C-Code wegzulassen. Es ist nicht erforderlich, und das Hinzufügen kann Fehler verbergen. Also ja, behandeln Sie sie als zwei verschiedene Sprachen. +1 :)
Jalf
26
@BlueRaja Stellen Sie sich vor, Guido hätte beschlossen, seiner Skriptsprache keine Objekte hinzuzufügen, und zwei Gruppen hätten inkompatible Python-Gabeln erstellt, um Objekte hinzuzufügen, eines mit einem auf Smalltalk basierenden Objektmodell, das andere mit einem auf Simula basierenden Klassensystem. Dann verbesserte Guido Python weiter und konzentrierte sich auf seine Kernverwendung. Das ist näher an der C / Objective C / C ++ - Situation.
Pete Kirkham
11
@BlueRaja: Das sind zwei verschiedene Sprachen, die einen ziemlich großen gemeinsamen Kern haben. Wenn Sie in diesem gemeinsamen Kern programmieren, werden Sie Dinge tun, die in beiden Sprachen kein guter Code sind. Wählen Sie eine Sprache aus, in der Sie ein bestimmtes Programm schreiben möchten, und machen Sie es in dieser Sprache gut.
David Thornley
115

Mir ist klar, dass es weder eine professionelle noch eine besonders gute Antwort ist, aber für mich ist es einfach, weil ich C. wirklich mag. C ist klein und einfach und ich kann die ganze Sprache in mein Gehirn einpassen. C ++ schien mir immer ein riesiges Durcheinander zu sein Mit allen Arten von Schichten fällt es mir schwer zu grokken. Aus diesem Grund stelle ich fest, dass ich beim Schreiben von C ++ viel mehr Zeit damit verbringe, meinen Kopf zu debuggen und gegen harte Oberflächen zu schlagen, als wenn ich C codiere. Wiederum stelle ich fest, dass ein Großteil davon größtenteils auf meine eigene „Ignoranz“ zurückzuführen ist.

Wenn ich mich entscheiden kann, schreibe ich all die hochrangigen Dinge wie die Interface- und Datenbankinteraktion in Python (oder möglicherweise C #) und all die Dinge, die in C schnell sein müssen. Für mich gibt das das Beste von allen Welten. Alles in C ++ zu schreiben, fühlt sich an, als würde man das Schlimmste von allen Welten bekommen.

Bearbeiten: Ich möchte hinzufügen, dass ich denke, dass C mit einigen C ++ - Funktionen größtenteils eine schlechte Idee ist, wenn mehrere Personen an einem Projekt arbeiten oder wenn die Wartbarkeit Priorität hat. Es wird Meinungsverschiedenheiten darüber geben, was ein paar sind und welche Bits in C ausgeführt werden sollten und welche Bits in C ++ letztendlich zu einer sehr schizophrenen Codebasis führen.

dagw
quelle
24
Ich habe C ++ mehrere Jahre lang verwendet und immer noch 50% meiner Zeit damit verbracht, Code so umzugestalten, dass er "C ++ korrekt" ist. Es ist ein Albtraum, wie Sie sagen.
Kai
12
Sie können es immer gleich beim ersten Mal richtig machen. Das Hinzufügen von const ist nicht schwierig.
GManNickG
14
Ich habe C ++ zehn Jahre lang verwendet, und die Rückkehr zu C (in meinem Fall für eingebettete Systeme) war das Beste, was ich jemals getan habe.
Warren P
Ich liebe diese Antwort. Du hast auch meine Gefühle genagelt. Ich habe jahrelang als C ++ - Entwickler gearbeitet, mein Tagesjob ist immer noch C ++. Das heißt aber nicht, dass ich die Sprache mag, ich sehe Schönheit in C.
Matt Joiner
10
+1, Aus diesem Grund stelle ich fest, dass ich beim Schreiben von C ++ viel mehr Zeit damit verbringe, meinen Kopf zu debuggen und gegen harte Oberflächen zu schlagen, als wenn ich C codiere . Kann dir nicht mehr zustimmen. Die beste Antwort. :)
ApprenticeHacker
58

C ++ wird in einigen realen Umgebungen wie eingebetteten Systemen auf niedriger Ebene einfach nicht unterstützt. Und dafür gibt es einen guten Grund: C ist für solche Dinge leicht gut genug. Warum also etwas Größeres verwenden?

Joonas Pulakka
quelle
2
Richtig. Ich habe C-Compiler für 8-Bit-Mikrocontroller gesehen.
dmckee --- Ex-Moderator Kätzchen
6
natürlich. Die meisten, wenn nicht alle 8-Bit-Chips haben heutzutage C-Compiler.
Eli Bendersky
gbdk.sourceforge.net - GBDK für einen ..
Kelden Cowan
+1 das ist die richtige Antwort. C ++ - Compiler sind viel schwieriger zu schreiben als C-Compiler, was hauptsächlich auf die Komplexität der (Mehrfach-) Vererbung zurückzuführen ist.
BlueRaja - Danny Pflughoeft
9
@BlueRaja: im Vergleich zu Vorlagen ... Mehrfachvererbung ist hier möglicherweise nicht die wirkliche Abschreckung. Immerhin bilden Vorlagen eine vollwertige eigene Sprache.
Matthieu M.
49

Ich hasse es, in C ++ zu programmieren.

Georg Schölly
quelle
6
Lol Ich mag das
Tamas Czinege
30
Sehr überzeugend! Ich denke darüber nach, aufgrund Ihrer Argumentation zu Python zu wechseln.
Jimmy J
8
Vielleicht nicht überzeugend, aber es ist der wahre Grund.
Georg Schölly
@ Jimmy J: Python ist unglaublich. Es ist das Beste aus Unix, C und all Ihren "modernen" Sprachfunktionen, die richtig gemacht wurden. Wenn Sie Leistungsprobleme haben, möchte Python, dass Sie in C wechseln, und das ganz einfach.
Matt Joiner
2
@Georg: Ich gebe zu, ich habe noch nie einen Blick darauf geworfen, ich bin so beeindruckt von Python.
Matt Joiner
38

Einige Gründe könnten sein:

  • Mangelnde Unterstützung - Nicht jeder C-Compiler ist auch ein C ++ - Compiler. Nicht alle Compiler sind besonders konform mit dem Standard, auch wenn sie behaupten, C ++ zu unterstützen. Und einige C ++ - Compiler generieren hoffnungslos aufgeblähten und ineffizienten Code. Einige Compiler haben schreckliche Implementierungen der Standardbibliothek. Die Entwicklung im Kernel-Modus macht die Verwendung der C ++ - Standardbibliothek sowie einiger Sprachfunktionen im Allgemeinen unmöglich. Sie können immer noch C ++ - Code schreiben, wenn Sie sich an den Kern der Sprache halten, aber dann ist es möglicherweise einfacher, zu C zu wechseln.
  • Vertrautheit. C ++ ist eine komplexe Sprache. Es ist einfacher, jemandem C beizubringen als C ++, und es ist einfacher, einen guten C-Programmierer zu finden als einen guten C ++ - Programmierer. (Das Schlüsselwort hier ist "gut". Es gibt viele C ++ - Programmierer, aber die meisten von ihnen haben die Sprache nicht richtig gelernt.)
  • Lernkurve - Wie oben ist es eine große Aufgabe, jemandem C ++ beizubringen. Wenn Sie eine App schreiben, die in Zukunft von anderen gewartet werden muss, und diese anderen möglicherweise keine C ++ - Programmierer sind, erleichtert das Schreiben in C das Erfassen erheblich.

Ich würde es immer noch vorziehen, in C ++ zu schreiben, wenn ich damit durchkommen kann, und insgesamt denke ich, dass die Vorteile die Nachteile überwiegen. In einigen Fällen kann ich aber auch das Argument für die Verwendung von C erkennen.

jalf
quelle
4
Ich würde hinzufügen, dass C-Code viel schneller kompiliert als C ++. Ein riesiges Projekt in unserem Unternehmen (mehr als eine Million Zeilen) kompiliert weniger als 30 Sekunden.
Calmarius
31

Es gibt viele Argumente über eingebettete Programmierung, Leistung und so, ich kaufe sie nicht. C ++ ist in diesen Bereichen leicht mit C zu vergleichen. Jedoch:

Erst kürzlich, nachdem ich über 15 Jahre in C ++ programmiert hatte, habe ich meine C-Wurzeln wiederentdeckt. Ich muss sagen, dass es in C ++ zwar gute Funktionen gibt, die das Leben leichter machen, aber auch eine Menge Fallstricke und eine Art "es gibt immer einen besseren Weg", Dinge zu tun. Sie werden nie wirklich glücklich über die Lösung, die Sie gemacht haben. (Versteh mich nicht falsch, das könnte eine gute Sache sein, aber meistens nicht).

C ++ gibt Ihnen unendliche Schüsse. Das könnte wohl gut sein, aber irgendwie verbraucht man immer zu viel davon. Dies bedeutet, dass Sie Ihre Lösungen mit "schönen" und "hübschen" Schichten von Abstraktionen, Allgemeinheit usw. verschleiern.

Als ich zu C zurückkehrte, stellte ich fest, dass es wieder Spaß machte, zu programmieren. Nachdem ich so viel Zeit damit verbracht habe, zu modellieren und darüber nachzudenken, wie ich die Vererbung am besten nutzen kann, finde ich, dass die Programmierung in C meinen Quellcode tatsächlich kleiner und lesbarer macht. Dies hängt natürlich von Ihrer Selbstdisziplin ab. Es ist jedoch sehr einfach, zu viele Abstraktionen auf einfachen Code zu setzen, der eigentlich nie benötigt wird.

Anders Hansson
quelle
8
Keine Beleidigung, aber es kann auch davon abhängen, was Sie für C ++ halten. Vererbung ist etwas, das ich mehr mit Java als mit C ++ verbinde. Wenn Sie C ++ streng als OOP-Sprache à la Java (C mit Klassen) behandeln, stimme ich Ihnen zu. Wenn Sie sich an eine modernere Variante von C ++ halten, macht es meiner Meinung nach mehr Spaß als C
jalf
11
Wieder einmal denke ich nicht an C ++ als OO-Sprache und es sollte nicht als eine behandelt werden. Ich denke, generische Programmierung ist ein viel stärkeres Merkmal von C ++. Der größte Teil des C ++ - Codes, den ich sehe, ist nicht besonders bemüht, "OO" zu sein oder unnötigen Code zu enthalten. Es ist oft schlanker als der entsprechende C-Code
Jalf
3
@jalf: Eine andere Sache, die ich finde, kann zu einer Ablenkung in C ++ werden, bei der es immer einen besseren Weg gibt, Dinge mit Vorlagen zu verallgemeinern. "Vielleicht sollten wir den Benutzer dieser Klasse entscheiden lassen, welcher zugrunde liegende Ganzzahltyp verwendet werden soll?" Aber das brauchen Sie wahrscheinlich nicht , und in C würden Sie sich nicht darum kümmern. Und manchmal denke ich: "Wir sollten dieser Klasse wirklich eine Forward-Iterator-Schnittstelle bereitstellen", wenn Sie in C nur einen Zeiger auf das erste Element und eine Zählung oder (die Höhe der Phantasie!) Eine Funktion verfügbar machen, die a übernimmt Rückruffunktionszeiger.
j_random_hacker
2
Ich finde einen Schritt zurück, wenn das Codieren in C ++ hilft. Entscheide dich für das Ziel und schreibe darauf (C-Stil). Faktor in C ++ - Ismen, wenn ihre Nützlichkeit offensichtlich wird.
Matt Joiner
2
infinite gunfireOh ja, so wahr. Unsere Füße zittern buchstäblich :)
Quetzalcoatl
27

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...

x4u
quelle
2
+1, konnte nicht mehr zustimmen.
fehlender Faktor
2
Dies klingt bemerkenswert parallel zu Linus 'Argumentation. (Weniger Objektkontext = leichter zu verstehen.)
Warren P
20

In einer eingebetteten Umgebung auf niedriger Ebene haben einige der "Software-Ingenieure" einen EE-Hintergrund und haben C kaum beherrscht. C ++ ist komplexer und einige dieser Leute haben einfach Angst, eine neue Sprache zu lernen. Somit wird C als kleinster gemeinsamer Nenner verwendet. (Bevor Sie vorschlagen, diese Typen loszuwerden, sind sie mindestens genauso wichtig wie die CS-Majors, die das analoge Hardcore-Zeug nicht verstehen.)

Aus Erfahrung sprechen, beides geerbt und gepflegt zu haben: Ein schreckliches Design in C ist schwer zu verstehen, abzuwickeln und in etwas Nutzbares umzugestalten.

Ein schreckliches Design in C ++ ist unendlich schlimmer, da zufällige Abstraktionsebenen Ihr Gehirn durch die Codebasis rasen lassen, um herauszufinden, welcher Code unter welchen Umständen ausgeführt werden soll.

Wenn ich mit Ingenieuren zusammenarbeiten muss, von denen ich weiß, dass sie keine großartigen Designs produzieren, hätte ich lieber die ersteren als die letzteren.

bstpierre
quelle
Amen, Bruder. Nachdem ich mit C-Quellen gearbeitet habe, die von Hardware-Ingenieuren erstellt wurden, schaudert es mich zu überlegen, was mich erwartet, wenn sie es in C ++ getan hätten.
Richard Chambers
19

Ich sehe keinen anderen Grund als persönliche Abneigung, selbst für die Programmierung eingebetteter Systeme und ähnlicher Dinge. In C ++ zahlen Sie nur für die von Ihnen verwendeten Funktionen Overhead. Sie können die C-Teilmenge von C ++ in bestimmten Situationen verwenden, in denen der C ++ - Overhead für Sie zu hoch ist. Ich denke jedoch, dass einige C-Programmierer den Overhead einiger C ++ - Konstrukte überschätzen. Lassen Sie mich einige Beispiele auflisten:

  • Klassen und Elementfunktionen haben im Vergleich zu normalen Funktionen keinen Overhead (es sei denn, Sie verwenden virtuelle Funktionen. In diesem Fall gibt es keinen Overhead im Vergleich zur Verwendung von Funktionszeigern).
  • Vorlagen haben sehr wenig Overhead (meistens überhaupt keinen Overhead)

Ein triftiger Grund wäre, wenn Sie für eine Plattform programmieren, die keinen anständigen C ++ - Compiler hat (es gibt überhaupt keinen C ++ - Compiler oder einen Compiler, der jedoch schlecht implementiert ist und für einige C ++ - Funktionen einen unnötig hohen Overhead verursacht).

Suma
quelle
3
Eine Klasse mit virtuellen Funktionen hat mehr Overhead: Jede Instanz muss ein zusätzliches Feld mit sich führen, um den Typ zu identifizieren.
Bstpierre
6
Mehr Aufwand als was? Der Typ wird im vtbl geführt. Wenn Sie einen ähnlichen Mechanismus mithilfe von Funktionszeigern implementieren, benötigen Sie mindestens einen Zeiger (oder Index oder was auch immer), um den Funktionszeiger auszuwählen, den Sie verwenden möchten.
Suma
3
bstpierre: Ich denke, was Suma sagt, ist: dass es nicht mehr Overhead hat, als die Funktion manuell in C zu implementieren.
Martin York
2
In jeder Instanz der Klasse wird ein Zeiger auf die vtable-Klasse gespeichert.
Tstenner
5
Es gibt einen Overhead, aber ich meine, wenn Sie eine dynamische Typauflösung wünschen, benötigen Sie etwas Speicher, um den Typ zu identifizieren, auch in C. Wenn Sie die dynamischen Typen nicht möchten, müssen Sie den Overhead nicht bezahlen ( Verwenden Sie keine virtuellen Funktionen, wenn Sie diese nicht benötigen.
Suma
13

Warum das Sprechen auf Englisch einschränken? Vielleicht wären Sie ein kreativerer Autor auf Serbisch.

Das ist das gleiche Argument mit offensichtlichen Irrtümern. Wenn Sie eine Aufgabe haben und Ihre komfortablen Werkzeuge die Aufgabe effizient lösen, werden Sie Ihre komfortablen Werkzeuge wahrscheinlich aus gutem Grund verwenden.

SPWorley
quelle
3
Wenn ich sowohl fließend Englisch als auch fließend Serbisch sprechen würde, wäre ich sicher kreativer. Stimmen Sie nicht zu?
2
@Neil in der Tat, aber der Aufwand, um Serbisch zu lernen, ist möglicherweise nicht gerechtfertigt, um meinen aktuellen Kreativitätsblock zu lösen.
schlank
2
Ich denke, Arno hebt die Tatsache hervor, dass Sie nicht für die CPU schreiben, sondern für Ihre Mitarbeiter zum Lesen und Ihre anderen Bibliotheken zum Verknüpfen und so weiter. Wenn ich nur Ausdruckskraft und Geschwindigkeit anstrebe, würde ich schließlich in OCaml schreiben.
Ken
10

C ++ hat eine viel längere Lernkurve. C hat nur wenige Konstrukte, die Sie kennen müssen, und dann können Sie mit dem Codieren leistungsfähiger Software beginnen. In C ++ müssen Sie die C-Basis, dann die OO und die generische Programmierung, die Ausnahme usw. lernen. Nach einiger Zeit kennen Sie möglicherweise die meisten Funktionen und können sie wahrscheinlich verwenden, aber Sie wissen immer noch nicht, wie der Compiler dies tun wird Übersetzen Sie sie, welchen impliziten Overhead sie haben oder nicht. Dies kostet viel Zeit und Energie.

Für ein professionelles Projekt zählt dieses Argument möglicherweise nicht, da Sie Mitarbeiter beschäftigen können, die C ++ bereits sehr gut kennen. In Open Source-Projekten, in denen C immer noch häufig verwendet wird, wählen die Benutzer die Sprache aus, die sie mögen, und sie können sie verwenden. Bedenken Sie, dass nicht jeder OS-Programmierer ein professioneller Programmierer ist.

Quinmars
quelle
1
Ähm ... nein? Sie lernen die C-Basis (möglicherweise mit Ausnahme von Arrays und C-Style-String-Behandlung zugunsten von <vector> und <string>) und können loslegen. Sie können alles andere aufheben, während Sie gehen. Sie müssen nichts über OO, GP oder Ausnahmen wissen, um mit C ++ zu beginnen ...
DevSolar
4
C mag "kleiner" sein, aber auf lange Sicht ist es nicht einfacher zu bedienen. Manuelle Speicherverwaltung? Nein Danke.
Jimmy J
7
In C ++ gibt es keine automatische Speicherverwaltung.
Warren P
3
C ++ löst das Speicherverwaltungsproblem nicht. Gerade als Sie dachten, Sie hätten Zeiger im Griff, fügt C ++ ein schreckliches Ausnahmemodell hinzu. Kommen Sie ins C99-Land. Abgesehen von Datenstrukturen bin ich mir ziemlich sicher, dass ich Malloc kaum berühre. Selbst dann kann ich eine Handvoll Malloc-Anrufe "einkapseln". In C ++ (implizite Speicherverwaltung, nur auf dem Heap statt auf dem Stack) ist es ähnlich, nur mit all dem Smart Pointer Jazz.
Matt Joiner
1
@ereOn: Es ist wahr, der Kommentar, wie ich ihn vor 3 Jahren geschrieben habe, gilt nicht mehr. :)
Matt Joiner
10

Ich möchte die Antwort von Dan Olson weiterverfolgen. Ich glaube, dass die Leute die potenziell gefährlichen und kontraproduktiven Funktionen von C ++ fürchten, und das zu Recht. Aber anders als Dan sagt, denke ich aus zwei Gründen nicht, dass die einfache Entscheidung für einen Codierungsstandard effektiv ist:

  1. Es kann schwierig sein, Codierungsstandards strikt durchzusetzen
  2. Es kann sehr schwierig sein, einen guten zu finden.

Ich denke, dass der zweite Grund hier viel wichtiger ist als der erste, da die Entscheidung für einen Kodierungsstandard leicht zu einer politischen Angelegenheit werden und später überarbeitet werden kann. Betrachten Sie den folgenden vereinfachten Fall:

  1. Sie dürfen STL-Container verwenden, jedoch keine Vorlagen in Ihrem eigenen Code.
  2. Die Leute beschweren sich, dass sie produktiver wären, wenn sie nur diese oder jene Vorlagenklasse codieren könnten.
  3. Der Codierungsstandard wurde überarbeitet, um dies zu ermöglichen.
  4. Schieben Sie eine Steigung auf einen übermäßig komplizierten Codierungsstandard, dem niemand folgt, und verwenden Sie genau die Art von gefährlichem Code, die der Standard verhindern sollte, kombiniert mit übermäßiger Bürokratie, die den Standard umgibt.

(Die Alternative, dass der Standard in Schritt 3 nicht überarbeitet wird, ist empirisch zu unwahrscheinlich, um in Betracht gezogen zu werden, und wäre sowieso nicht viel besser.)

Obwohl ich C ++ vor ein paar Jahren für fast alles verwendet habe, habe ich das starke Gefühl, dass C für Aufgaben auf niedriger Ebene vorzuziehen ist, die entweder von C oder C ++ erledigt werden müssen, und alles andere sollte in einem anderen erledigt werden Sprache ganz. (Nur mögliche Ausnahmen sind bestimmte Hochleistungsproblemdomänen, z. B. Blitz ++ )

TrayMan
quelle
10

Ich verwende C oder exportiere zumindest eine C-Schnittstelle, wenn ich Bibliothekscode schreibe.

Ich möchte keine schlecht definierten ABI-Probleme.

Rhythmischer Faustmann
quelle
Gleich. Striktes C nur in Schnittstellen. Das Letzte, was ich will, ist das lächerliche Objekt-Framework eines anderen, das mir aufgedrängt wurde.
Matt Joiner
9

Ich habe noch nie Argumente für die Verwendung von C über C ++ gesehen, die ich für überzeugend halten würde. Ich denke, die meisten Menschen haben Angst vor bestimmten Funktionen, die C ++ bietet, oft zu Recht. Dies überzeugt mich jedoch nicht, da man durch Codierungsstandards durchsetzen kann, ob bestimmte Funktionen verwendet werden sollen oder nicht. Selbst in C gibt es viel, was Sie vermeiden möchten. Das vollständige Verwerfen von C ++ bedeutet im Wesentlichen, dass es keine konkreten Vorteile gegenüber C bietet, die dazu beitragen würden, besseren Code zu schreiben. Diese Ansicht halte ich für ziemlich unwissend.

Darüber hinaus scheinen die Leute immer die Situation von Plattformen zu erhöhen, auf denen kein C ++ - Compiler existiert. Sicherlich wäre C hier angemessen, aber ich denke, es würde Ihnen heutzutage schwer fallen, eine solche Plattform zu finden.

Dan Olson
quelle
3
Einverstanden, die "C ist besser als C ++" Rants halten nie der Prüfung stand.
Jimmy J
6
Ich glaube, C ++ bietet mir SEHR KLEINE Vorteile und KOSTEN MICH eine enorme Menge an versehentlicher Komplexität. Ich glaube, es würde ungefähr 1500 Seiten C ++ - Lehrbücher und zehn Jahre Mühe erfordern, um C ++ so gut zu beherrschen, wie ich es derzeit in C, Pascal, Python und Objective-C bin. Jede der oben genannten Sprachen ist ungefähr 20x orthogonaler, kompakter und mental bequemer zu verwenden, ganz zu schweigen von der Leistungsfähigkeit in den Umgebungen, in denen ich sie verwende. In meinen üblichen Entwicklungsumgebungen gibt es einfach KEINE rational vertretbaren Verwendungen für C ++.
Warren P
@ Warren Du bezahlst nur für das, was du benutzt, genau wie jede Sprache. Wenn Sie nicht in der Lage sind, zu entscheiden, wie Sie in C ++ mit Bedacht codieren, liegt das an Ihnen, nicht an der Sprache.
Dan Olson
2
Nicht so. Wenn Sie der einzige Entwickler in einem Projekt sind, ist dies möglicherweise der Fall. Aber sobald wir zwei Entwickler haben, haben wir Schlachten. Was? Sie bestehen auf IoC-Containern, während ich eine andere Art der Delegierung bevorzuge ... Sie mögen drei Ebenen verschachtelter Vorlagen, und ich bevorzuge Nullvorlagen. Ein Durcheinander.
Warren P
Ich weiß, dass dieser Beitrag 10 Jahre alt ist, aber ist es wirklich fair, C und C ++ überhaupt noch zu vergleichen? Sie sind beide getrennte, unterschiedliche Sprachen (seit C99) und sie haben beide ihre Vor- und Nachteile, die jede einzelne abdeckt. C ++ ist schwer zu debuggen und zu warten? Mit Cs expliziter Aussage können Sie besser debuggen. C hat keine Generika? C ++ hat Generika! Zu diesem Zeitpunkt ist keine Sprache besser als die andere.
Nergal
9

Ein Punkt, den ich noch nicht angesprochen habe, ist meiner Meinung nach der wichtigste:

Die meisten Bibliotheken, die ich täglich benutze, sind C-Bibliotheken mit Bindungen für Python, Ruby, Perl, Java usw. Soweit ich gesehen habe, ist es viel einfacher, C-Bibliotheken mit 19 verschiedenen Sprachbindungen zu verpacken, als dies der Fall ist C ++ - Bibliotheken umbrechen.

Zum Beispiel habe ich Kairo einmal gelernt und es seitdem in 3 oder 4 verschiedenen Sprachen verwendet. Großer Gewinn! Ich würde lieber ein Programm schreiben, das in Zukunft wieder verwendet werden kann, und ein Programm zu schreiben, das leicht in andere Programmiersprachen übernommen werden kann, ist ein extremer Fall.

Ich weiß, dass es möglich ist, C ++ - Bibliotheken zu binden, aber AFAICT ist es nicht dasselbe. Ich habe Qt (v3 und v4) in anderen Sprachen verwendet und es ist bei weitem nicht so schön zu verwenden: Sie möchten C ++ in einer anderen Sprache schreiben, nicht wie native Bibliotheken. (Sie müssen C ++ - Methodenzeichen als Zeichenfolgen übergeben!)

C ++ ist wahrscheinlich eine bessere Sprache, wenn Sie eine Funktion schreiben, die einmal verwendet werden soll, oder wenn Sie glauben, dass die ganze Welt C ++ ist. C scheint eine einfachere Sprache zu sein, wenn Sie von Anfang an auf Sprachportabilität ausgelegt sind.

Ken
quelle
Die "Pass-Methoden als Strings!" Sache ist ein Defekt von Qt, nicht C ++. Sie könnten tatsächlich den gleichen dummen Mechanismus mit einem C-Framework haben, das Sie möchten. Sogar die Jungs von Qt sind sich einig, dass dies ein Fehler war. Zu dieser Zeit gab es für sie einfach keine bessere Alternative und es war zu spät, sie wieder zu ändern, als sie es merkten.
Uhr
7

Die Windows-Kernel-Entwicklung unterstützt C ++ (leider) nicht.

LegendLength
quelle
Wie ist das? Warum? Unterscheidet sich die von einem C ++ - Compiler erzeugte Binärdatei von einem C-Compiler? Hält sich die Treiberentwicklung nicht einfach an APIs?
Dave Van den Eynde
4
Da viele C ++ - Funktionen Laufzeitunterstützung erfordern, ist die Implementierung im Kernelmodus möglicherweise nicht trivial. Zum einen werden verschiedene Speicherzuweisungsfunktionen verwendet, sodass Teile der Standardbibliothek ersetzt werden müssten. Ausnahmen sind im Allgemeinen auch schlecht.
Jalf
3
Ich werde hinzufügen, dass Linux Torvalds glücklicherweise aus mehr Gründen als Ausnahmen jede Chance auf C ++ unter Linux in Brand gesteckt hat. Es gab einige Betriebssysteme in anderen Sprachen: Java, C ++, Assembler. Nur die Assembler haben mit vernünftiger Nutzung überlebt.
Matt Joiner
Beachten Sie, dass es für Visual Studio 2015 ist?
LegendLength
6

Sie können eine unterhaltsame schimpfen darüber , warum Linus Torvalds favorisiert C lesen hier

Paul Dixon
quelle
6
Es ist eher eine halbkohärente Beschimpfung gegen objektorientiertes Design als eine Beschimpfung gegen C ++.
Dan Olson
16
Herr Torvalds hat eine lange Liste von Dingen, die er nicht mag, C ++, Emacs, Subversion, OO, um nur einige zu nennen. Man wünscht sich manchmal, er würde seine Lippe etwas mehr
11
Linus schimpft gern und versucht, Menschen zu provozieren und zu verärgern. Leider hat er sich nicht die Mühe gemacht , C ++ zu lernen, bevor er erklärt hat, dass es scheiße ist. Leider glauben seine Kult-Anhänger, dass alles, was er sagt, wahr sein muss.
Jalf
9
Der Link war mehr für Unterhaltung als für Bildung
Paul Dixon
6
Beweis, dass sogar Genies manchmal Dolts sein können.
Kaz Dragon
5

Native Code auf einem Mac ist Objective-C. Der native Code auf einem PC ist c (window.h) oder c ++ (mfc). In beiden Umgebungen können Sie c mit nur geringen oder keinen Änderungen verwenden. Wenn ich möchte, dass eine Codebibliothek plattformübergreifend ist, scheint ansi c eine gute Wahl zu sein.

Nick Van Brunt
quelle
4

Ich kann mir mehrere Gründe vorstellen.

Möglicherweise gibt es keinen zufriedenstellenden C ++ - Compiler. C ++ ist eine viel größere Sprache, und ich habe C-Compiler auf Systemen ausgeführt, die mit modernem C ++ nicht umgehen können.

Der Fragesteller oder die Personen, mit denen er oder sie zusammenarbeitet, sind möglicherweise mit C vertraut, nicht jedoch mit C ++.

Das Projekt befindet sich möglicherweise in C. Obwohl es möglich ist, C einige C ++ - Funktionen hinzuzufügen, kann dies leicht zu einem nicht zu wartenden Durcheinander führen. Ich würde vorschlagen, die eine oder andere Sprache auszuwählen (normalerweise C ++, wenn es praktisch ist).

Der Fragesteller hat möglicherweise eine veraltete Ansicht der Lernkurve von C ++. (Bei richtiger Annäherung ist es einfacher als bei C. Die meisten Einführungsbücher, die ich gesehen habe, nähern sich nicht richtig.)

Denken Sie daran, dass C und C ++ zwei verschiedene Sprachen sind und sich mit der Zeit immer mehr unterscheiden. Es ist eine schlechte Idee, beide gleichzeitig zu codieren, und bei Verwendung einer C-ähnlichen Teilmenge von C ++ fehlen die meisten Vorteile von C ++.

David Thornley
quelle
3

Wenn Sie in einer Umgebung mit zwei Sprachen arbeiten, können Sie C für einige leistungskritische Funktionen auf niedriger Ebene und eine funktionalere / höhere Sprache wie C # / Java für die Geschäftslogik verwenden. Wenn für diese Funktionen C ++ - Code verwendet wird, sind C-Wrapper für JNI / nicht verwalteten Code erforderlich. Dies macht die Dinge komplexer als die alleinige Verwendung von C.

weismat
quelle
3

Ich benutze C ++ mit C-Programmierung aus zwei Gründen:

  • vectorund stringum die Array-Speicherverwaltung von mir wegzubekommen
  • strenge Typprüfung und Abdrücke, um alle Belästigungen zu warnen und / oder aufzufangen, die ich sonst vermissen würde.

Es ist also C, der wirklich ein paar C ++ ausleiht, aber den C ++ - Compiler so oft wie möglich verwendet. Wie jemand anderes in den Antworten sagt, finde ich jetzt, dass ich auf diese Weise tatsächlich mehr C ++ aufgreife und wo C zu involviert wäre, verwende ich C ++. Das Überwachen / Sperren mit RAII ist eines davon, das ich kürzlich beim Umgang mit Multithread-Programmen und einem anderen ähnlichen Konstrukt zum Öffnen / Schließen von Dateien verwendet habe.

dubnde
quelle
3

Ich denke, C ist tragbarer. Ich habe vor ungefähr 5 Jahren einige Arbeiten durchgeführt, um Code auf viele Unix-Varianten (AIX, Irix, HPUX, Linux) zu portieren. Der C-Code war leicht zu portieren, aber wir hatten verschiedene Probleme, einen Teil des C ++ - Codes zu portieren. Vielleicht waren es nur unreife Entwicklungsumgebungen, aber aus diesem Grund würde ich lieber C über C ++ verwenden ...

Gordon Thompson
quelle
1
Vor fünfzehn Jahren war ich Hauptentwickler für ein C ++ - Projekt, das auf HPUX, AIX und Solaris abzielte. Wir hatten nur sehr wenige C ++ - Portabilitätsprobleme - fast alle hatten Probleme mit den Inkompatibilitäten des C-Systemaufrufs.
1
Vor weniger als zehn Jahren war ich in einem Projekt mit HPUX, Solaris und Tru64 unter Verwendung der traditionellen Compiler. Unsere Nachtschwärmer haben nie gebaut. Als wir AIX hinzufügten, entschieden wir uns, auf Standard-C ++ umzusteigen.
David Thornley
Vielleicht waren die Leute, die Ihren Code geschrieben haben, bessere Programmierer als der Mist, mit dem ich zu tun hatte :-)
Gordon Thompson
3
  1. C ist eine einfache Sprache, C ++ nicht. Für viele Menschen ist C ++ einfach zu kompliziert, um es vollständig zu beherrschen, siehe http://en.wikipedia.org/wiki/C%2B%2B#Criticism .

  2. Aufgrund der Komplexität beherrschen verschiedene Programmierer normalerweise nur verschiedene Teilmengen der Sprache. Es macht das Lesen des Codes anderer Leute schmerzhaft.

  3. Die Komplexität und die Fallstricke der Sprache lenken zu sehr ab und beeinträchtigen manchmal die Produktivität. Anstatt mich auf den Job selbst zu konzentrieren, kämpfte ich oft mit der Sprache selbst. Java / Python sind produktivere Alternativen.

  4. Das Debuggen eines defekten C-Codes ist normalerweise viel einfacher als das Debuggen eines defekten C ++ - Codes.

  5. Im Gegensatz zu Java / C # erreicht die C ++ - Standardbibliothek nur wenig über den Rahmen der C-Standardbibliothek hinaus.

  6. Einige berühmte Programmierer wie Linus Torvalds (Linux) und Richard Stallman (Emacs) mögen C ++ nicht.

Alan Bradley
quelle
3
Ich habe darüber nachgedacht, Ihre Antwort abzustimmen, bis ich Argument 6 gelesen habe.
Fuz
1

Die meisten Programmierer halten es für selbstverständlich, dass jeder Qualität als hohe Priorität ansieht. Das ist nicht immer der Fall. Wenn Sie an C gewöhnt sind, scheint C ++ hinter den Kulissen zu viel für Sie zu tun. Die Strenge der Typprüfung in C ++ scheint ebenfalls einschränkend zu sein. Viele Menschen sind bereit zu riskieren, die Art von Fehlern einzuführen, die C ++ verhindern kann, um diese "Belästigungen" zu vermeiden.

Rob deFriesse
quelle
1
Hmm, der Grund, warum ich vor langer Zeit von C zu C ++ gewechselt bin, war die strengere Typprüfung. Ich mag es, wenn der Compiler meine Fehler findet, anstatt dass der Benutzer einen Core-Dump erfährt.
1

Ich kann mir drei Gründe vorstellen. Zum einen eignet sich C aufgrund der geringen Größe seiner Binärdateien und der größeren Verfügbarkeit von C-Compilern auf jedem System besser für eingebettete Systeme. Die zweite ist die Portabilität: C ist eine kleinere Sprache, und ANSI C-Code wird überall kompiliert. In C ++ ist es einfacher, die Portabilität zu unterbrechen. Der letzte ist die Sprache selbst. C ++ ist schwieriger und definitiv eine sehr schlecht gestaltete Sprache. Torvalds Griffe sind oben angegeben. Möglicherweise möchten Sie auch die häufig gestellten Antworten zu C ++ ( http://yosefk.com/c++fqa/ ) lesen .

gappy
quelle
5
Und wenn Sie intelligent sind, werden Sie nach dem Betrachten der FQA feststellen, dass es sich um einen Hack-Job von jemandem handelt, der C ++ nicht wirklich versteht, es aber trotzdem hasst.
David Thornley
1

Portabilität kann ein Problem sein. Anders als bei Gordon Carpenter-Thomp würde ich vorschlagen, dass es sich eher um die Laufzeitunterstützung verschiedener Versionen von libstdc ++ unter verschiedenen Linux / Unix-Versionen handelt. Siehe diesen Link für eine gute Diskussion darüber. Ein kleiner Auszug:

Der von verschiedenen Teilen einer C ++ - Anwendung verwendete Laufzeitunterstützungscode muss kompatibel sein. Wenn ein Teil des Programms von einem anderen bereitgestellte Objekte dynamisch übertragen oder abfangen muss, müssen sich beide Teile auf bestimmte Implementierungsdetails einigen: wie man vtables findet, wie man den Stapel abwickelt und so weiter.

Für C ++ und einige andere GCC-unterstützte Sprachen mit ähnlichen Funktionen werden solche Details von einem C ++ - ABI angegeben. Immer wenn sich der von GCC verwendete ABI ändert, werden inkompatible Bibliotheken angezeigt, die von den verschiedenen GCC-Versionen erstellt wurden. Das gleiche gilt für einfaches C, aber das C ABI ist viel einfacher und gibt es schon viel länger, so dass es ziemlich stabil ist.

ferdystschenko
quelle
1

Ich kann hier vielen Vorschlägen in beide Richtungen folgen. Aber am Ende kommt es auf a) vergleichbare einfache b) vergleichbare komplexe.

Ich habe keine Ahnung, ob jemand eine Art Sprachkomplexitätsmessung "erfunden" hat.

Auf einer Skala von 0 bis 10 würde ich C wahrscheinlich mit 2 oder 3 bewerten, während C ++ zwischen 8 und 10 liegen würde. Ich würde behaupten, C ++ ist eine der komplexesten Sprachen, aber ich kenne zB Ada, PL1 oder ähnliches nicht. Vielleicht ist es im Vergleich zu einer anderen Sprache nicht so komplex.

C ++ erbt die gesamte Komplexität von C, sodass sie nicht unter der Komplexitätsstufe von C liegen kann.

Ich für meinen Teil würde mich mit einer Skriptsprache und C viel wohler fühlen. Am Ende muss man also die folgende Frage beantworten. "Ist mehr immer besser?"

Friedrich
quelle
1

Das Nützlichste, was ich in C gefunden habe, ist das Fehlen von Namespaces und Überladungen: Funktions- und Symbolnamen sind eindeutige Bezeichner. Um die Orte zu finden, an denen diese Symbole verwendet werden, können Sie einfach grepdie Quellcodedateien durchsuchen. In den Suchergebnissen werden die Orte angezeigt.

Dies ist wichtig, wenn Sie eine neue Funktion oder Komponente an ein altes und verworrenes System anschließen.

In C ++ ist dies ohne ein ausgeklügeltes Tool zum Erstellen von Anrufdiagrammen nicht einfach.

Calmarius
quelle
0

Die meisten Leute scheinen zu denken, dass C und C ++ irgendwie verwandt sind, aber sie irren sich leider. C ++ ist eine völlig andere Sprache als C.

In C ++ denken Sie in Objekten und wie sie miteinander in Beziehung stehen. In C denken Sie in APIs. Es ist wie der Unterschied zwischen Tag und 17.

Eine schlechte Analogie: Wenn jemand Chinesisch zu Englisch hinzufügt und es Englisch ++ nennt, würden Sie sich wahrscheinlich nicht wohl fühlen, wenn Sie Ihrem neuesten Liebesbrief eine chinesische Zeile hinzufügen, weil es in diesem Teil von Englisch ++ so viel einfacher ist, Liebe auszudrücken.

Philip
quelle
0

Die folgenden Gründe sprechen dafür, dass es vorteilhaft sein kann, ein Projekt auf C zu beschränken:

  • schnellere Kompilierung, da die Sprache viel einfacher ist
  • erfordert weniger Laufzeitunterstützung, wodurch es besser für Umgebungen auf niedriger Ebene geeignet ist
  • viel einfacher mit anderen Sprachen zu verbinden
  • unterstützt Arrays mit variabler Größe auf dem Stapel
  • Einfacher zu lesender Assembler-Code, da keine Namensverfälschung vorliegt
  • Ermöglicht die einfache Kombination von Code, der von verschiedenen Compilern erstellt wurde, da es sich um die De-facto-Standard-Anwendungsbinärschnittstelle handelt
dsh
quelle