Warum sollte jemand C über C ++ verwenden? [geschlossen]

132

Obwohl sich die Leute anscheinend gerne über C ++ beschweren , konnte ich nicht viele Beweise dafür finden, warum Sie C anstelle von C ++ wählen möchten. C scheint nicht annähernd so viel Flak zu bekommen, und wenn C ++ all diese Probleme hat, warum können Sie sich nicht einfach auf die C-Teilmenge beschränken? Was sind deine Gedanken / Erfahrungen?

Simucal
quelle
exakter doppelter Link funktioniert nicht mehr ..... sagt der Typ, der zu spät zur C-Party kommt :)
Kyle
4
C ist wirklich besser und einfacher für C ++, aber jeder C-Programmierer kann C ++ in C konvertieren und lachen.
BobRun
11
Das Erschreckende ist, dass die Leute im Allgemeinen denken, "++" bedeutet, dass dies wirklich gut ist. Tut mir leid, dass es nicht so ist.
BobRun
Abgesehen von den offensichtlichen - kleinen / eingebetteten Geräten - ist C im Allgemeinen besser für reine Zahlenverarbeitungsprobleme (z. B. GPU-Grafikverarbeitung, massiv parallele physikalische Berechnungen, Pattern Mining usw.), bei denen OOP-Funktionen aufgedunsen sind. C ++ ist besser für die Modellierung von Systemen geeignet, in denen 'Dinge' interagieren, viel einfacher mit OOP-Funktionen.
Paceman
3
Weil JavaScript, Best Practices, C ++ und OOP dumm / zu beschäftigt sind, um diese abstrakten Probleme zu lösen, die wahrscheinlich nicht wirklich existieren oder jemals gelöst werden müssen.
Marschall Handwerk

Antworten:

132

Joels Antwort ist gut für die Gründe könnten Sie haben C zu verwenden, obwohl es ein paar andere sind:

  • Sie müssen die Branchenrichtlinien erfüllen, die in C leichter zu beweisen und zu testen sind.
  • Sie haben Tools für die Arbeit mit C, aber nicht für C ++ (denken Sie nicht nur an den Compiler, sondern an alle Support-Tools, die Abdeckung, die Analyse usw.).
  • Ihre Zielentwickler sind C-Gurus
  • Sie schreiben Treiber, Kernel oder anderen Code auf niedriger Ebene
  • Sie wissen, dass der C ++ - Compiler nicht gut darin ist, die Art von Code zu optimieren, die Sie schreiben müssen
  • Ihre App eignet sich nicht nur nicht für die Objektorientierung, sondern ist auch schwieriger in dieser Form zu schreiben

In einigen Fällen möchten Sie jedoch möglicherweise C anstelle von C ++ verwenden:

  • Sie möchten die Leistung eines Assemblers ohne die Mühe des Codierens im Assembler (C ++ ist theoretisch in der Lage, eine 'perfekte' Leistung zu erzielen, aber die Compiler sind nicht so gut darin, Optimierungen zu sehen, die ein guter C-Programmierer sehen wird).
  • Die Software, die Sie schreiben, ist trivial oder fast so - ziehen Sie den winzigen C-Compiler heraus, schreiben Sie ein paar Codezeilen, kompilieren Sie und schon sind Sie fertig - Sie müssen keinen großen Editor mit Helfern öffnen, müssen nicht praktisch schreiben Leere und nutzlose Klassen, Umgang mit Namespaces usw. Mit einem C ++ - Compiler können Sie fast dasselbe tun und einfach die C-Teilmenge verwenden, aber der C ++ - Compiler ist selbst für kleine Programme langsamer.
  • Sie benötigen extreme Leistung oder kleine Codegröße und wissen, dass der C ++ - Compiler die Ausführung aufgrund der Größe und Leistung der Bibliotheken tatsächlich erschwert

Sie behaupten, Sie könnten nur die C-Teilmenge verwenden und mit einem C ++ - Compiler kompilieren, aber Sie werden feststellen, dass Sie in diesem Fall je nach Compiler leicht unterschiedliche Ergebnisse erhalten.

Unabhängig davon, wenn Sie das tun, verwenden Sie C. Ist Ihre Frage wirklich "Warum verwenden C-Programmierer keine C ++ - Compiler?" Wenn ja, dann verstehen Sie entweder die Sprachunterschiede nicht oder Sie verstehen die Compilertheorie nicht.

Adam Davis
quelle
2
Es gibt auch den MISRA C-Standard, den AFAIK für C ++ noch nicht wirklich stabil ist.
Paul Nathan
60
Der Leistungsteil ist nicht unbedingt wahr. Es gibt viele Bereiche, in denen C ++ weitaus besser optimieren kann als C. (Natürlich ist gelegentlich auch das Gegenteil der Fall, aber im Allgemeinen ist es aus Leistungsgründen eine schlechte Idee, C anstelle von C ++ zu wählen.)
Jalf
9
Ich würde mich für weitere Leistungsinformationen interessieren. Ich verstehe nicht, warum C "gelegentlich" besser abschneiden würde. Bei einem durchschnittlichen Programmierer kann es sein, dass C ++ das Erreichen der Leistung erleichtert (gute Verwendung von Mustern), aber ein von einem Experten geschriebenes C-Programm sollte schneller sein - geringerer Overhead.
Adam Davis
3
Natürlich würde das Schreiben und Debuggen des schnelleren C-Programms länger dauern, daher gibt es einen Kompromiss, und angesichts der Geschwindigkeit der Maschinen lohnt sich der Kompromiss nur selten, außer bei speziellen Anwendungen, weshalb C ++ im Allgemeinen besser ist. (
Adam Davis
21
@Adam: C ++ bietet eine bessere Leistung als C mit "hübschem" Code. C ++ kann Vorlagen und Inline-Funktionen verwenden, bei denen C ein Makro benötigt. C ++ - Overhead wird nur angezeigt, wenn Sie dazu aufgefordert werden. Andernfalls entspricht er C. (virtual, try / throw, dynamic_cast). Ein Großteil des Overheads wird nur in der Programmbildgröße angezeigt.
Zan Lynx
88

Ich mag Minimalismus und Einfachheit.

plan9assembler
quelle
9
OK - fair genug ... warum also nicht Forth?
Jonathan Leffler
14
Ich würde vermuten, dass er auch gerne Bibliotheken, Bücher und Foren zur Verfügung hat.
Gnud
30
Ich mag den Minimalismus und die Einfachheit Ihrer Antwort ... :)
Joe DF
8
Zustimmen. C ist sehr einfach und "klein". C sieht immer gleich aus und wenn Sie ein neuer Mitarbeiter eines Projekts sind, ist es leicht zu verstehen, wie es funktioniert. c ++ hat einige nutzlose Dinge und wenn ich mir ein c ++ Projekt anschaue, bin ich sofort verwirrt. Ich kann die C ++ - Leute verstehen (eine C-Sprache mit OO-Fähigkeiten), aber C ist einfach und leicht.
user69969
1
Ich denke auch, dass C eine viel besser geeignete Sprache ist, um eine Art von Bibliotheken zu schreiben, wie kleine universelle Bibliotheken, Skriptsprachen und, ja, Rendering-Engines.
Keebus
65
  • Weil sie C bereits kennen
  • Weil sie eine eingebettete App für eine Plattform erstellen, die nur einen C-Compiler hat
  • Weil sie in C geschriebene Legacy-Software warten
  • Sie schreiben etwas auf der Ebene eines Betriebssystems, einer relationalen Datenbank-Engine oder einer 3D-Videospiel-Engine für den Einzelhandel.
Joel Coehoorn
quelle
4
Einige Mikrocontroller haben nur C-Compiler, was wirklich scheiße ist. Die grundlegenden C ++ - Funktionen (Namespaces, Klassen neben virtuellen Funktionen, Aufzählungen, Deklarieren von Variablen an anderer Stelle neben Top-of-Block) sind meiner Meinung nach die wertvollsten, IMHO.
Jason S
2
Es klingt so, als würden Sie C nur wählen, wenn es keine vernünftigen Alternativen gibt.
2
@ Joe: Abgesehen vom ersten Punkt, fasst das ungefähr zusammen. Viele der späteren Sprachen nahmen C und sagten: "Hey, wir können es besser machen ."
Joel Coehoorn
1
Einverstanden. Wenn Sie nicht die ausgefeilten C ++ - Funktionen verwenden, glaube ich, dass C ++ monoton ein besseres C ist. Mit den ausgefeilteren C ++ - Funktionen werden die Dinge umstrittener, aber dann ist die Debatte normalerweise im Vergleich zu einer höheren Abstraktionsebene, z. B. Java.
Paul Nathan
4
Die meisten 3D-Game-Engines verwenden tatsächlich C ++. UE4 verwendet meistens C ++.
Aditya Kashi
56

Leistungsängste oder Aufblähungen sind kein guter Grund, auf C ++ zu verzichten. Jede Sprache hat ihre potenziellen Fallstricke und Kompromisse - gute Programmierer lernen diese kennen und entwickeln erforderlichenfalls Bewältigungsstrategien, schlechte Programmierer werden schlecht und geben der Sprache die Schuld.

Interpretiertes Python wird in vielerlei Hinsicht als "langsame" Sprache angesehen, aber für nicht triviale Aufgaben kann ein erfahrener Python-Programmierer leicht Code erstellen, der schneller ausgeführt wird als der eines unerfahrenen C-Entwicklers.

In meiner Branche, Videospielen, schreiben wir Hochleistungscode in C ++, indem wir Dinge wie RTTI, Ausnahmen oder virtuelle Funktionen in inneren Schleifen vermeiden. Diese können äußerst nützlich sein, weisen jedoch Leistungs- oder Aufblähungsprobleme auf, die vermieden werden sollten. Wenn wir noch einen Schritt weiter gehen und ganz auf C umsteigen würden, würden wir wenig gewinnen und die nützlichsten Konstrukte von C ++ verlieren.

Der größte praktische Grund für die Bevorzugung von C ist, dass die Unterstützung weiter verbreitet ist als C ++. Es gibt viele Plattformen, insbesondere eingebettete, die nicht einmal über C ++ - Compiler verfügen.

Es gibt auch die Frage der Kompatibilität für Anbieter. Während C über eine stabile und gut definierte ABI (Application Binary Interface) verfügt, ist dies in C ++ nicht der Fall. Das ABI in C ++ ist aufgrund von vtables und Konstruktoren / Destruktoren komplizierter und wird daher bei jedem Anbieter und sogar bei Versionen einer Toolchain eines Anbieters unterschiedlich implementiert.

In Wirklichkeit bedeutet dies, dass Sie eine von einem Compiler generierte Bibliothek nicht mit Code oder einer Bibliothek eines anderen verknüpfen können, was einen Albtraum für verteilte Projekte oder Middleware-Anbieter von Binärbibliotheken darstellt.

Andrew Grant
quelle
7
"Interpretiertes Python wird in vielerlei Hinsicht als" langsame "Sprache angesehen, aber für nicht triviale Aufgaben kann ein erfahrener Python-Programmierer leicht Code erstellen, der schneller ausgeführt wird als der eines unerfahrenen C-Entwicklers." Ich denke, ein Programmierer (nicht unbedingt ein Python-Programmierer), der Algorithmenunterricht genommen hat, kann Code erzeugen, der schneller ausgeführt wird als der eines unerfahrenen Entwicklers (im Allgemeinen).
Andrei Ciobanu
15
Und derselbe unerfahrene c-Entwickler erzeugt Python-Code, der langsamer ist als sein c-Code. Python ist viel langsamer als c.
Millie Smith
37

Ich schreibe lieber in C, weil ich gerne mit einer kleinen, engen Sprache arbeite. Ich mag den Zugang zu einem Standard, der in angemessener Zeit gelesen werden kann (für mich - ich bin ein sehr langsamer Leser). Darüber hinaus schreibe ich damit Software für eingebettete Systeme, für die es nur wenige wünschenswerte C ++ - Compiler gibt (wie einige PIC-Mikrocontroller).

anon
quelle
re: PICs - Ich fühle deinen Schmerz. Wenn ich jemals viel PIC-Code machen muss, werde ich wahrscheinlich den IAR-Compiler verwenden, der C ++ unterstützt. Ich habe es auf dem MSP430 verwendet und es ist ziemlich schön.
Jason S
1
Und vergessen Sie nicht die erheblich verbesserten Kompilierungszeiten für C. Kein Vorlagensystem.
Ingenieur
35

Ich bin der anderen Ansicht: Warum C ++ anstelle von C verwenden?

Das Buch The C Programming Language (auch bekannt als: K & R) zeigt Ihnen auf weniger als 300 Seiten, wie Sie alles tun können, was die Sprache kann. Es ist ein Meisterwerk des Minimalismus. Kein C ++ - Buch kommt dem auch nur nahe.

Das offensichtliche Gegenargument ist, dass das Gleiche für die meisten, wenn nicht alle modernen Sprachen gesagt werden kann - sie können Ihnen auch nicht sagen, wie man alles auf nur ein paar hundert Seiten macht. Wahr. Warum also stattdessen C ++ verwenden? Funktionsreichtum? Leistung? Wenn Sie etwas mehr Funktionen oder Leistungsstarkes benötigen, wählen Sie C #, Objective C, Java oder ähnliches. Warum sollten Sie sich mit der Komplexität von C ++ belasten? Wenn Sie den Grad der Kontrolle benötigen, den C ++ gewährt, dann argumentiere ich, C. C kann alles und kann es gut.

Dinah
quelle
Genau. Ich möchte Kraft, also benutze ich etwas wirklich Kraftvolles, nicht den halben Wegpunkt.
Dinah
7
@ Dinah: Der 1/2 Wegpunkt bietet Ihnen eine höhere Ausdrucksstärke ohne die Leistung und die Speicherkosten von C # oder Java.
Zan Lynx
5
@ Zan Lynx: Du hast recht. Aber ich hoffe, dass ich durch die gegnerische Haltung, die ich in meinem ursprünglichen Beitrag vertreten habe, einen Punkt über die Lebensfähigkeit von C gegenüber C ++ gemacht habe ... auch wenn es, wie Sie betonen, kein offener und geschlossener Fall ist.
Dinah
28

Neben einigen anderen bereits erwähnten Punkten:

Weniger überraschend

Das heißt, es ist viel einfacher zu sehen, was ein Code genau bewirkt . In C ++ müssen Sie sich der Guru-Ebene nähern, um genau zu wissen, welchen Code der Compiler generiert (versuchen Sie eine Kombination aus Vorlagen, Mehrfachvererbung, automatisch generierten Konstruktoren, virtuellen Funktionen und mischen Sie ein wenig Namespace-Magie und argumentabhängige Suche ein).

In vielen Fällen ist diese Magie nett, aber zum Beispiel in Echtzeitsystemen kann sie Ihren Tag wirklich vermasseln.

jdisk
quelle
27

Linus 'Antwort auf Ihre Frage lautet "Weil C ++ eine schreckliche Sprache ist".

Seine Beweise sind bestenfalls anekdotisch, aber er hat einen Punkt ..

Da es sich eher um eine einfache Sprache handelt, würden Sie es C ++ vorziehen. C ++ ist C mit zusätzlichen Bibliotheken und Compiler-Unterstützung für zusätzliche Funktionen ( beide Sprachen haben Funktionen, die die andere Sprache nicht bietet, und implementieren die Dinge anders ), aber wenn ja Aufgrund der Zeit und Erfahrung mit C können Sie von zusätzlichen zusätzlichen Fähigkeiten auf niedriger Ebene profitieren ... [Bearbeitet] (weil Sie sich daran gewöhnt haben, mehr Arbeit manuell zu erledigen, anstatt von einigen Fähigkeiten zu profitieren, die von der Sprache / dem Compiler selbst stammen)

Links hinzufügen:

Warum C ++ für Embedded

Warum benutzt du immer noch C? PDF

Ich würde dafür googeln .. weil es bereits viele Kommentare im Web gibt

Ric Tokyo
quelle
17
Ich habe viel in C programmiert, dann eine kurze Zeit in C ++, dann eine peinlich lange Zeit mit VB, und jetzt benutze ich C # seit einigen Jahren. Ich habe seitdem ein bisschen C- und C ++ - Code geschrieben und festgestellt, dass C gut definiert und eng ist, C # cool und leistungsstark ist und C ++ einfach nur scheiße ist.
CMPalmer
25
Linus ist nicht wirklich qualifiziert, um über die Vorzüge von C ++ zu sprechen. Ihn zu zitieren, als wäre er eine Art Orakel, ist einfach dumm. Und das bisschen über "Dinge auf die harte Tour machen" macht keinen Sinn. Es gibt gute Gründe, C zu verwenden, aber "es ist mehr Arbeit" oder "Linus sagte es" gehören nicht dazu.
Jalf
8
@jalf, ohne Linus zu zitieren, als wäre er eine Art Orakel, ist es gut, die Meinung eines bekannten Programmierers für seine Auswahl in einem der am häufigsten verwendeten Programme der Welt zu erwähnen: dem Linux-Kernel. Die Frage fragt nach Meinungen (warum jemand C wählen würde), was ich beantworten wollte.
Ric Tokyo
6
Linus ist eine schlechte Quelle für Meinungen zu C ++, weil er es nicht benutzt und, soweit ich weiß, es 1990 nur einmal ausprobiert hat - etwas.
Zan Lynx
3
@Zan Linus zeigte an anderer Stelle mehr Selbstkontrolle: "Wir hätten gerne C ++ und die damit verbundenen zusätzlichen Funktionen verwendet, aber es ist schwieriger zu erkennen, wo in C ++ fehlerhafter Code als in C vorhanden ist." Das Zitat auf meiner Antwort ist eher eine Aufzeichnung einer Meinung als ein "Follow the Leader".
Ric Tokyo
26

Weil sie ein Plugin schreiben und C ++ keinen Standard-ABI hat.

Michel
quelle
9
Obwohl dies zutrifft, ist es kein überzeugender Grund, sich an C zu halten, da Sie die erforderlichen Funktionen mithilfe der C-Verknüpfung exportieren und Ihre Implementierung dennoch in C ++ beibehalten können.
Codelogic
2
@codelogic - C ++ - Projekte exportieren tendenziell viel mehr Typen und Funktionen als die entsprechenden C-Projekte. Es ist möglich, dies in einer endgültigen gemeinsam genutzten Bibliothek zu verbergen, aber es ist möglicherweise mehr Aufwand als es wert ist.
Tom
tbh keine wirklich gute Antwort, aber +1, weil C ++ keinen Standard-ABI hat (ja .. C ++ saugt)
hasen
6
C hat auch keinen Standard-ABI.
Stephen Canon
25

Lange Kompilierungszeiten können ärgerlich sein. Mit C ++ können Sie sehr lange Kompilierungszeiten haben (was natürlich mehr Zeit für Stack Overflow bedeutet!).

Frank
quelle
Warum wurde dies abgelehnt? Ich arbeite selbst viel in C ++ und würde nicht zu C zurückkehren, aber es kann tatsächlich schmerzhaft lange Kompilierungszeiten geben (denken Sie zum Beispiel an Vorlagen).
Frank
6
Ich benutze C ++ für echte Arbeit, aber ich habe immer einen Prototyp in C wegen der fast augenblicklichen Kompilierungszeiten.
Tom
Hmm, wenn es richtig gemacht wird, dh wenn wir nicht aufgebläht sind, brauchen wir möglicherweise diese # Includes und sind uns nicht sicher, welches das richtige Include ist, also werde ich sie alle einschließen # einschließlich der Kompilierungszeiten sind ordentlich. Wenn ich eine oder drei Dateien hacke, brauche ich nur 1-2 Sekunden, um meine 100 KLOC-Projekte zu kompilieren.
Sebastian Mach
4
@ Tom: Ich frage mich, wie Ihre eigentliche Arbeit in C ++ aussieht, wenn Sie in C Prototypen erstellen können. Verwenden Sie nicht die Funktionen von C ++? Können Sie das näher erläutern?
Sebastian Mach
24

Ich bin es gewohnt, C ++ für meine Projekte zu verwenden. Dann bekam ich einen Job, bei dem einfaches C verwendet wird (eine 20 Jahre alte Codebasis einer AV-Software mit schlechter Dokumentation ...).

Die 3 Dinge, die ich in C mag, sind:

  • Nichts ist implizit: Sie sehen, was Ihr Programm genau tut oder nicht. Dies erleichtert das Debuggen.

  • Das Fehlen von Namespaces und Überladungen kann von Vorteil sein: Wenn Sie wissen möchten, wo eine bestimmte Funktion aufgerufen wird, durchsuchen Sie einfach das Quellcode-Verzeichnis und Sie werden darüber informiert. Keine weiteren Spezialwerkzeuge erforderlich.

  • Ich habe die Leistung der Funktionszeiger wiederentdeckt. Grundsätzlich können Sie damit alle polymorphen Dinge erledigen, die Sie in C ++ tun, aber sie sind noch flexibler.

Calmarius
quelle
8
+1 Ein solcher Polymorphismus in C wird jedoch normalerweise über void * erhalten, was gefährlich ist, da der Compiler nicht prüfen kann, ob Sie etwas Böses tun.
GD1
4
@ gd1 In der Praxis kann ich mich nicht an einen einzigen Fall erinnern, in dem dies void*zu Problemen führte. Es gibt viele defensive Programmiertechniken, um sich vor Fehlern zu schützen: Asserts überall platzieren, magische Zahlen in Ihre Strukturen einfügen (in Debug-Builds) usw. Aber heutzutage haben wir Valgrind, Dr. Speicher und sogar MSVC instrumentieren den Code, um Probleme zu erkennen, sodass Speicherbeschädigungsprobleme ziemlich einfach zu lösen sind.
Calmarius
4
Ich habe fast nie eine Speicherbeschädigung in meinen Programmen, aber wenn möglich, würde ich es vorziehen, wenn Fehler erkannt werden, bevor das Programm ausgeführt wird. Casting void*to whatever*ist etwas, das der Compiler in gutem Glauben akzeptiert. Ich bevorzuge, dass mein Compiler mir nicht vertraut und die Möglichkeit hat, robuste Typprüfungen zu erzwingen. Von C ++ - Compilern ausgegebene Fehler beim Ersetzen von Vorlagen sind schmerzhaft zu lesen, aber zumindest wird Garbage nicht kompiliert.
GD1
1
@ gd1 Zurück zu Ihrem ersten Kommentar, ich weiß nicht, wie viel Erfahrung Sie mit Prozedurtechniken haben (ich sehe, dass Sie hauptsächlich in OO-Tags aktiv sind). Das void*kann normalerweise vermieden werden. Das typische Muster beim Hinzufügen eines benutzerdefinierten Verhaltens ist die Übergabe eines Funktionszeigers und eines void*für Benutzerdaten. Eine generische Schnittstelle sieht normalerweise so aus. Wenn die Bibliothek dies void*dann an Ihren Rückruf zurückgibt, ohne etwas anderes damit zu tun. Meistens haben Sie keine zusätzlichen Daten, übergeben also NULL und ignorieren den Benutzerparameter in Ihrem Rückruf. Ich nahm an, dass du das wusstest.
Calmarius
@Calmarius "Meistens haben Sie keine zusätzlichen Daten" -> Dies ist eigentlich der Vorteil des Polymorphismus. Es ist einfach, zusätzliche Daten zu binden, ohne leere Zeiger zu verwenden. Ihre Entschuldigung lautet also im Grunde: "Ich benutze diese Funktion sowieso nicht wirklich."
user2445507
15

Ich bin überrascht, dass niemand Bibliotheken erwähnt hat. Viele Sprachen können sich mit C-Bibliotheken verknüpfen und C-Funktionen aufrufen (einschließlich C ++ mit externem "C"). C ++ ist so ziemlich das einzige, was eine C ++ - Bibliothek verwenden kann (definiert als 'eine Bibliothek, die Funktionen in C ++ verwendet, die nicht in C enthalten sind [wie überladene Funktionen, virtuelle Methoden, überladene Operatoren, ...] und nicht exportiert alles über C-kompatible Schnittstellen über externes "C" ').

BigSandwich
quelle
1
Nicht so; Sie können Ihre Funktionen extern "C" oder __cdecl, um sie C auszusetzen.
Crashworks
Großartig, aber mit welchen anderen Sprachen funktioniert das?
BigSandwich
2
Eine C lib kann an weit mehr Orten arbeiten.
BigSandwich
1
Alle, die auf C.
verlinken
2
Der offensichtlichste Grund für Interoperabilitätsprobleme ist die Namensverfälschung, und ich denke, das ist es wert, angesprochen zu werden.
Tom
15

Wenn Sie möchten, dass Ihr Code von praktisch jedem Programmierer verstanden wird, schreiben Sie in C.

Liran Orevi
quelle
12

Weil sie Funktionen in C99 verwenden möchten, die in C ++ keine Entsprechungen haben.


Es gibt jedoch nicht so viele C99-Funktionen, die für C ++ nützlich sind, wie die Leute auf den ersten Blick denken. Arrays mit variabler Länge? C ++ hat std :: Vektoren. Unterstützung für komplexe / imaginäre Zahlen? C ++ hat einen komplexen Typ mit Vorlagen. Typ-generische mathematische Funktionen? C ++ hat die Standard-Mathematikfunktionen überladen und das gleiche Ergebnis erzielt.

Benannte Initialisierer? Nicht in C ++, aber es gibt eine Problemumgehung:

struct My_class_params {
    int i;
    long j;
    std::string name;

    My_class_params& set_i(int ii)
    {
        i = ii;
        return *this;
    }

    My_class_params& set_j(long jj)
    {
        j = jj;
        return *this;
    }


    template <typename STRING>
    My_class_params& set_name(STRING&& n)
    {
        name = std::forward<STRING>(n);
        return *this;
    }

    My_class_params()
    {
        // set defaults
    }
};

class My_class {
    My_class_params params;
  public:
    My_class(const My_class_params& p) : params(p) { }
    ...
};

Auf diese Weise können Sie Dinge schreiben wie:

My_class mc(My_class_params().set_i(5).set_name("Me"));
Max Lybbert
quelle
Hört hört! Das Fehlen benannter benannter Initialisierer in C ++ treibt mich jedes Mal an die Wand, wenn ich es verwenden muss.
Ephemient
2
Ich bin mit 100% auf den Initialisierern !!!
Richter Maygarden
Wenn Sie eine globale Struktur außerhalb einer Funktion initialisieren möchten (Sie können also nicht .set _ * ()), zwingt C ++ Sie, die unbenannte Initilizer-Syntax zu verwenden oder einen Konstruktor für Ihre Struktur zu schreiben. Ich mag keine dieser Optionen.
Ephemient
Es gibt auch VLAs in C99 (GCC), mit denen viel einfacher zu arbeiten ist als std:vector.
Vahid Amiri
10

Denn für viele Programmieraufgaben ist C einfacher und gut genug. Wenn ich besonders leichte Dienstprogramme programmiere, kann ich das Gefühl haben, dass C ++ möchte, dass ich eine elegante Überstruktur für mich selbst einbaue, anstatt einfach nur den Code zu schreiben.

OTOH, für komplexere Projekte bietet die Eleganz eine solide solide strukturelle Genauigkeit, als sie natürlich aus meiner Tastatur herausfließen würde.

dkretz
quelle
8

Die meisten wichtigen Funktionen von C ++ betreffen Klassen oder Vorlagen. Dies sind wunderbare Funktionen, außer wie der Compiler diese in Objektcode umwandelt. Die meisten Compiler verwenden Name Mangling und diejenigen, die etwas nicht mindestens so chaotisch machen.

Wenn Ihr System wie bei vielen Anwendungen für sich alleine lebt, ist C ++ eine gute Wahl.

Wenn Ihr System mit Software interagieren muss, die nicht unbedingt in C ++ geschrieben wurde (am häufigsten in Assembler- oder Fortran-Bibliotheken), befinden Sie sich in einer schwierigen Situation. Um mit solchen Fällen zu interagieren, müssen Sie die Namensverwaltung für diese Symbole deaktivieren. Dies erfolgt normalerweise durch Deklarieren dieser Objekte extern "C". Es kann sich jedoch nicht um Vorlagen, überladene Funktionen oder Klassen handeln. Wenn dies wahrscheinlich Ihre Anwendungs-API ist, müssen Sie sie mit Hilfsfunktionen umschließen und diese Funktionen mit den tatsächlichen Implementierungen synchronisieren.

In Wirklichkeit bietet die C ++ - Sprache eine Standardsyntax für Funktionen, die einfach in reinem C implementiert werden können.

Kurz gesagt, der Overhead von interoperablem C ++ ist zu hoch, als dass die meisten Leute dies rechtfertigen könnten.

TokenMacGuy
quelle
3
Ich bin sehr erschrocken, das zu hören, weil ich so viele DLLs in C ++ geschrieben habe, die externe "C" -Schnittstellen hatten, damit sie von C oder einer anderen CLR-Sprache aufgerufen werden konnten. Natürlich können Sie Elementfunktionszeiger nicht einfach verfügbar machen, aber es ist wirklich kein großes Problem, Daten für __cdecl-Aufrufe zu sammeln.
Crashworks
1
Tatsächlich können Sie Vorlagencode exportieren. Für jeden Typ, den Sie verwenden möchten, sind lediglich Funktions-Wrapper ohne Vorlagen erforderlich, um Namenskollisionen zu vermeiden.
Richter Maygarden
8

Das ist ziemlich flach, aber als vielbeschäftigter Schüler habe ich C gewählt, weil ich dachte, C ++ würde zu lange dauern, um es zu lernen. Viele Professoren an meiner Universität akzeptieren keine Aufgaben in Python und ich musste schnell etwas lernen.

vinc456
quelle
8
Klug von deinen Lehrern!
Andrei Ciobanu
6

Eine Bemerkung zu "Verwenden Sie einfach die Teilmenge von C ++, die Sie verwenden möchten": Das Problem bei dieser Idee besteht darin, dass die Erzwingung, dass jeder im Projekt dieselbe Teilmenge verwendet, mit Kosten verbunden ist. Meine eigene Meinung ist, dass diese Kosten für lose gekoppelte Projekte (z. B. Open Source-Projekte) ziemlich hoch sind und dass C ++ kein besseres C ist, in dem Sinne, dass Sie C ++ nicht überall dort verwenden können, wo Sie C verwendet haben.

David Cournapeau
quelle
6

Oh mein Gott, C gegen C ++, eine großartige Möglichkeit, einen Flammenkrieg zu beginnen. :) :)

Ich denke, C ist besser für Treiber und eingebetteten Code.

C ++ hat einige großartige Funktionen, die C nicht hat, aber viele der objektorientierten Funktionen von C ++ können zu monumentalen Codierungsfehlern führen, wenn Benutzer Code mit nicht offensichtlichen Nebenwirkungen schreiben, die hinter den Kulissen auftreten. Verrückter Code kann in Konstruktoren, Destruktoren, virtuellen Funktionen usw. versteckt sein. Das Schöne an C-Code ist, dass die Sprache hinter Ihrem Rücken nichts Unverständliches tut. Sie können also den Code lesen und müssen nicht jeden Konstruktor und Destruktor nachschlagen und so weiter. Ein großer Teil des Problems sind schlechte Codierungspraktiken einiger Leute.

Meine perfekte Sprache wäre eine Kombination aus C99 und einer minimalen Teilmenge sicherer C ++ - Funktionen, die der Binärausgabe einen Compiler-Overhead von NULL (oder nahe Null) hinzufügen. Perfekte Ergänzungen wären Klassenkapselungs- und Namenskonzepte für Daten und Funktionen.

Aufklärung
quelle
Nennen Sie
4

Ich konnte nicht viele Beweise dafür finden, warum Sie C anstelle von C ++ wählen möchten.

Sie können kaum nennen, was ich sagen werde, Beweise; Es ist nur meine Meinung.

Leute mögen C, weil es gut in den Geist des Programmierers passt.

Es gibt viele komplexe Regeln in C ++ [wann benötigen Sie virtuelle Destruktoren, wann können Sie virtuelle Methoden in einem Konstruktor aufrufen, wie funktioniert das Überladen und Überschreiben, ...], und ihre Beherrschung erfordert viel Aufwand. Zwischen Verweisen, Überladen von Operatoren und Überladen von Funktionen kann das Verstehen eines Codeteils auch erfordern, dass Sie anderen Code verstehen, der möglicherweise leicht zu finden ist oder nicht.

Eine andere Frage, warum Unternehmen C C ++ vorziehen würden. Ich weiß das nicht, ich bin nur ein Volk ;-)

Zur Verteidigung von C ++ bringt es wertvolle Funktionen auf den Tisch; Das, was ich am meisten schätze, ist wahrscheinlich der parametrische ('ish) Polymorphismus: Operationen und Typen, die einen oder mehrere Typen als Argumente verwenden.

Jonas Kölker
quelle
2
++score: Ihre Aussage „Leute mögen C, weil es gut in den Geist des Programmierers passt“ ist eine sehr gut formulierte. In einer einfachen Sprache programmieren zu können, in der Sie wissen, dass das, was Sie sehen, das ist, was Sie erhalten, ist eine wirklich ansprechende Eigenschaft für eine Programmiersprache.
Tchrist
3

Ich würde sagen, dass C Ihnen eine bessere Kontrolle über Optimierung und Effizienz bietet als C ++ und daher in Situationen nützlich ist, in denen der Speicher und andere Ressourcen begrenzt sind und jede Optimierung hilft. Es hat natürlich auch einen geringeren Platzbedarf.

Chris
quelle
Können Sie Beispiele dafür nennen?
Andrew Grant
Der gleiche C-Code, der mit einem C-Compiler kompiliert wurde, ist also effizienter als mit einem C ++ - Compiler?
Steve Kuo
1
Vor Jahren konnte der Linux-Kernel mit gcc oder g ++ kompiliert werden, aber g ++ erstellte langsameren Code ( tux.org/lkml/#s15-3 unter "Schließlich, während Linus den Entwicklungskernel verwaltet ...").
Max Lybbert
Ich denke, ich habe mehr darüber nachgedacht, mehr darüber steuern zu können, wie Ihr Code in C über C ++ optimiert wird. Ähnlich wie ein Programmierer, der Assemblersprache verwendet, seinen Code genauer einstellen kann als ein Programmierer, der eine höhere Sprache verwendet.
Chris
2

Es gibt auch den Ansatz, den einige Geschäfte verfolgen, um einige der C ++ - Funktionen auf C-ähnliche Weise zu verwenden, aber diejenigen zu vermeiden, die zu beanstanden sind. Verwenden Sie beispielsweise Klassen und Klassenmethoden sowie Funktionsüberladungen (die normalerweise selbst für C-Diehards leicht zu bewältigen sind), nicht jedoch STL, Stream-Operatoren und Boost (die schwieriger zu erlernen sind und schlechte Speichereigenschaften aufweisen können).

Crashworks
quelle
1

Weil Sie für ein System schreiben, in dem die Ressourcen knapp sind (z. B. ein eingebettetes System oder ein echter Bare-Metal-Code wie ein Kernel) und Sie so wenig Aufwand wie möglich wünschen.

Es gibt einen Grund, warum die meisten eingebetteten Systeme keinen C ++ - Compiler haben - es ist nicht so, dass die Leute keinen wollen, es ist so, dass es unmöglich ist, C ++ - Code in einen so kleinen Raum zu stopfen.

Electrons_Ahoy
quelle
3
Nicht wirklich ein Problem von C ++ selbst als Sprache, aber das pathologische Aufblähen, das die wahllose Verwendung von Vorlagen verursachen kann.
Crashworks
1
ecos ist größtenteils in C ++ geschrieben. Es gibt keine Beziehung zwischen der Sprache (im Vergleich zu C) und der Größe der ausführbaren Datei (solange Sie wissen, welche Funktionen verwendet werden sollen).
user52875
1
"Solange Sie wissen, welche Funktionen Sie verwenden müssen". Das ist der Punkt - das Ergebnis der Aussage "Nun, wir haben C ++, aber wir können aus Overhead-Gründen nicht die Hälfte der Sprachfunktionen unterstützen" ist Symbian / C ++, das sowohl C-Programmierer als auch C ++ - Programmierer verwirrt und verärgert ...
Steve Jessop
1
In allen Punkten einverstanden. Unsere Lösung, um zu wissen, welche Funktionen verwendet werden sollen, bestand darin, einfach einen C-Compiler zu verwenden und ihn als Tag zu bezeichnen. Sicher, wir hätten C ++ zum Laufen bringen können (was auf Super-Nerd-Art wirklich Spaß gemacht hätte), aber wir hatten ein Produkt zu versenden und hatten keine Zeit, uns darüber Gedanken zu machen.
Electrons_Ahoy
1

Was C brauchte, war ein besserer Präprozessor. cfront war eins und somit c ++ geboren

Ich würde C verwenden, wo das 'c ++ als Präprozessor' nicht in Ordnung wäre.

Ich bin mir ziemlich sicher, dass Sie am Ende jeder gut geschriebenen C ++ - Bibliothek / Framework / Toolkit Dirty-Old-C (oder statische Casts, die gleich sind) finden würden.

vrdhn
quelle
0
  • Bis vor einigen Jahren fehlten den vorhandenen C ++ - Compilern wichtige Funktionen, oder die Unterstützung war schlecht, und die unterstützten Funktionen variieren stark zwischen ihnen. Daher war es schwierig, tragbare Anwendungen zu schreiben.
  • Aufgrund der fehlenden Standardbenennung von Symbolen ist es für andere Sprachen / Anwendungen schwierig, C ++ - Klassen direkt zu unterstützen.
Ismael
quelle