objective - Warum sollte jemand C über C++ benutzen?




using clang on windows (17)

Obwohl sich die Leute über C ++ zu complain scheinen, konnte ich nicht viele Hinweise finden, warum Sie C über C ++ wählen sollten. C scheint nicht so viel Flak zu bekommen und wenn C ++ all diese Probleme hat, warum können Sie sich nicht einfach auf die C-Untermenge beschränken? Was sind deine Gedanken / Erfahrungen?

https://code.i-harness.com


Ich konnte nicht viele Hinweise finden, warum Sie C über C ++ wählen sollten.

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

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

Es gibt viele komplexe Regeln von C ++ [wann brauchen Sie virtuelle Destruktoren, wann können Sie virtuelle Methoden in einem Konstruktor aufrufen, wie Überladen und Überschreiben interagiert, ...], und sie alle zu meistern, erfordert viel Aufwand. Zwischen Verweisen, dem Überladen von Operatoren und dem Überladen von Funktionen kann es beim Verstehen eines Stücks Code auch erforderlich sein, anderen Code zu verstehen, der möglicherweise leicht zu finden ist.

Eine andere Frage, warum Organisationen C gegenüber C ++ bevorzugen würden. Das weiß ich nicht, ich bin nur ein Volk ;-)

In der Verteidigung von C ++ bringt es wertvolle Funktionen auf den Tisch; die eine, die ich am meisten wertschätze, ist wahrscheinlich der parametrische ('ish-) Polymorphismus: Operationen und Typen, die einen oder mehrere Typen als Argumente annehmen.


Ängste vor Leistung oder Blähungen sind kein guter Grund, auf C ++ zu verzichten. Jede Sprache hat ihre möglichen Fallstricke und Kompromisse - gute Programmierer lernen dies und wo nötig entwickeln sie Bewältigungsstrategien, schlechte Programmierer werden verseucht und beschuldigen die Sprache.

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

In meiner Branche, Videospiele, schreiben wir Hochleistungscode in C ++, indem wir Dinge wie RTTI, Ausnahmen oder virtuelle Funktionen in inneren Schleifen vermeiden. Diese können extrem nützlich sein, haben aber Performance- oder Bloat-Probleme, die vermieden werden sollten. Wenn wir einen Schritt weiter gehen und ganz zu C wechseln 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 verbreiteter ist als C ++. Es gibt viele Plattformen, insbesondere eingebettete, die nicht einmal C ++ - Compiler haben.

Es gibt auch die Frage der Kompatibilität für Anbieter. Während C hat eine stabile und gut definierte ABI (Application Binary Interface) C ++ nicht. Die ABI in C ++ ist komplizierter aufgrund von Vtables und Konstruktoren / Destruktoren und wird daher mit jedem Hersteller und auch Versionen der Werkzeugkette eines Anbieters anders implementiert.

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


Denn für viele Programmieraufgaben ist C einfacher und gut genug. Wenn ich gerade Lightweight-Utilities programmiere, kann ich denken, dass C ++ will, dass ich in einen eleganten Überbau baue, anstatt einfach nur den Code zu schreiben.

OTOH, für komplexere Projekte bietet die Eleganz mehr gute solide strukturelle Strenge als würde natürlich aus meiner Tastatur fließen.


Die meisten wichtigen Funktionen von C ++ beinhalten Klassen oder Vorlagen. Dies sind wunderbare Eigenschaften, außer dass der Compiler diese in Objektcode umwandelt. Die meisten Compiler verwenden Namen Mangling, und diejenigen, die etwas nicht mindestens so chaotisch tun.

Wenn Ihr System, wie es bei vielen Anwendungen der Fall ist, von alleine lebt, ist C ++ eine gute Wahl.

Wenn Ihr System mit Software interagieren muss, die nicht unbedingt in C ++ geschrieben ist (am häufigsten in Assembler oder Fortran Libraries), sind Sie in einer schwierigen Situation. Um mit solchen Fällen zu interagieren, müssen Sie die Namensänderung für diese Symbole deaktivieren. Dies geschieht normalerweise, indem diese Objekte extern "C" deklariert werden, aber dann können sie keine Vorlagen, überladene Funktionen oder Klassen sein. Wenn dies wahrscheinlich Ihre Anwendungs-API ist, müssen Sie sie mit Hilfsfunktionen umschließen und diese Funktionen mit den tatsächlichen Implementierungen synchronisieren.

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

Kurz gesagt, der Overhead von interoperablem C ++ ist für die meisten Leute zu hoch, um dies zu rechtfertigen.


Es gibt auch den Ansatz einiger Shops, einige C ++ - Funktionen C-ähnlich zu verwenden, aber diejenigen zu vermeiden, die unerwünscht sind. Zum Beispiel Klassen- und Klassenmethoden und Überladen von Funktionen (die selbst von C-Eingeweihten normalerweise leicht zu bewältigen sind), aber nicht die STL, Stream-Operatoren und Boost (die schwerer zu erlernen sind und schlechte Speichereigenschaften haben können).


Ich benutze C ++ für meine Projekte. Dann habe ich einen Job bekommen, in dem einfaches C verwendet wird (eine 20 Jahre alte Codebasis einer AV-Software mit schlechter Dokumentation ...).

Die 3 Dinge die ich an C mag sind:

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

  • Das Fehlen von Namespaces und Überladungen kann von Vorteil sein: Wenn Sie wissen möchten, wo eine bestimmte Funktion aufgerufen wird, suchen Sie einfach im Quellcodeverzeichnis nach. Keine anderen Spezialwerkzeuge benötigt.

  • Ich habe die Kraft der Funktionszeiger wiederentdeckt. Grundsätzlich erlauben sie Ihnen, alle polymorphen Sachen zu tun, die Sie in C ++ machen, aber sie sind noch flexibler.


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


Ich mag Minimalismus und Einfachheit.


Ich würde sagen, dass C Ihnen bessere Kontrolle über Optimierung und Effizienz als C ++ gibt und daher in Situationen nützlich wäre, in denen Speicher und andere Ressourcen begrenzt sind und jede Optimierung hilft. Es hat natürlich auch einen kleineren Fußabdruck.


Joel's Antwort ist gut aus Gründen, warum Sie C benutzen müssen, obwohl es noch ein paar andere gibt:

  • Sie müssen Industrierichtlinien erfüllen, die in C einfacher zu prüfen und zu prüfen sind.
  • Sie haben Werkzeuge, um mit C zu arbeiten, aber nicht mit C ++ (denken Sie nicht nur an den Compiler, sondern an alle Support-Tools, Abdeckung, Analyse usw.)
  • Ihre Zielentwickler sind C-Gurus
  • Sie schreiben Treiber, Kernel oder anderen Low-Level-Code
  • Sie wissen, dass der C ++ - Compiler nicht gut darin ist, die Art von Code zu optimieren, den Sie schreiben müssen
  • Ihre App ist nicht nur nicht objektorientiert, sondern in dieser Form auch schwieriger zu schreiben

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

  • Sie möchten die Leistung von Assembler ohne die Mühe des Codierens in Assembler (C ++ ist theoretisch zu "perfekter" Leistung fähig, aber die Compiler sind nicht so gut darin, Optimierungen zu sehen, die ein guter C-Programmierer sehen wird)
  • Die Software, die du schreibst, ist trivial oder fast so - zieh den winzigen C-Compiler aus, schreibe ein paar Zeilen Code, kompiliere und du bist fertig - es ist nicht nötig, einen riesigen Editor mit Helfern zu öffnen, praktisch nicht zu schreiben leere und nutzlose Klassen, Umgang mit Namespaces usw. Man kann fast dasselbe mit einem C ++ - Compiler machen und einfach die C-Teilmenge verwenden, aber der C ++ - Compiler ist selbst für winzige Programme langsamer.
  • Sie benötigen extreme Leistung oder kleine Code-Größe und wissen, dass der C ++ - Compiler aufgrund der Größe und Leistung der Bibliotheken die Ausführung erschwert

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

Egal, wenn Sie das tun, verwenden Sie C. Ist Ihre Frage wirklich "Warum verwenden C-Programmierer keine C ++ - Compiler?" Wenn das so ist, dann verstehst du entweder die Sprachunterschiede nicht oder verstehst die Compiler-Theorie nicht.


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 um eine Sprache auf niedrigerer Ebene handelt, bevorzugen Sie C ++. 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 hat, und implementieren Dinge anders ), aber wenn Sie haben die Zeit und Erfahrung mit C, du kannst von zusätzlichen zusätzlichen niedrigen Energien profitieren ... [Bearbeitet] (weil du dich daran gewöhnt hast , mehr Arbeit manuell zu erledigen, anstatt von einigen Kräften zu profitieren, die von der Sprache / dem Compiler selbst kommen)

Hinzufügen von Links:

Warum C ++ für eingebettete

Warum benutzt du immer noch C? PDF

Ich würde das google ... weil es schon viele Kommentare im Web gibt


Neben einigen anderen bereits erwähnten Punkten:

Weniger Überraschung

das heißt, es ist viel einfacher zu sehen, was ein Code genau macht . In C ++ müssen Sie sich der Guru-Ebene nähern, um genau wissen zu können, welchen Code der Compiler generiert (versuchen Sie eine Kombination aus Templates, mehrfacher Vererbung, automatisch generierten Konstruktoren, virtuellen Funktionen und mischen Sie ein wenig magische und argumentabhängige Namespace-Lookup).

In vielen Fällen ist diese Magie gut, aber zum Beispiel in Echtzeit-Systemen kann es Ihren Tag wirklich vermasseln.


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

Ich würde C benutzen, 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 / jedes Framework / Toolkits dreckig-alt-c (oder statische Casts, die gleich sind) finden würden.


Weil Sie für ein System schreiben, in dem Ressourcen knapp sind (wie ein Embedded-System oder irgendein echter Bare-Metal-Code wie ein Kernel) und Sie so wenig Aufwand wie möglich möchten.

Es gibt einen Grund, warum die meisten Embedded-Systeme keinen C ++ - Compiler haben - es ist nicht so, dass die Leute keinen wollen, es ist dieser krachende C ++ - Code in diesem kleinen Raum ist eine Aufgabe, die nahezu unmöglich ist.


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


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


  • 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 pflegen
  • Sie schreiben etwas auf der Ebene eines Betriebssystems, einer relationalen Datenbank oder einer 3D-Videospiel-Engine.






c