Wie unterscheidet sich C von C ++?

21

Viele Leute haben gesagt, dass C ++ eine völlig andere Sprache ist als C, aber Bjarne selbst hat gesagt, dass C ++ eine Sprache ist, die von C erweitert wurde, daher ++kommt die Sprache von dort. Warum sagen alle immer wieder, dass C und C ++ völlig unterschiedliche Sprachen sind? Inwiefern unterscheidet sich C von C ++ von den erweiterten Funktionen in C ++?

Joshua Partogi
quelle
3
Aufgrund ihrer Verwendung. Sie können sicherlich C in C ++ schreiben ... aber Sie sollten nicht.
Ed S.

Antworten:

18

Während der 1980er Jahre, als die C ++ - Entwicklung gerade erst begann, war C ++ fast eine richtige Obermenge von C. So fing alles an.
Im Laufe der Zeit haben sich jedoch sowohl C als auch C ++ entwickelt und sind voneinander abgewichen, obwohl die Kompatibilität zwischen den Sprachen immer als wichtig angesehen wurde.

Darüber hinaus haben die technischen Unterschiede zwischen C und C ++ dazu geführt, dass die typischen Redewendungen in diesen Sprachen und die als "gute Praxis" geltenden Begriffe noch stärker voneinander abweichen.

Dies ist der treibende Faktor für Leute, die Dinge wie "Es gibt keine Sprache wie C / C ++" oder "C und C ++ sind zwei verschiedene Sprachen" sagen. Obwohl es möglich ist, Programme zu schreiben, die sowohl für einen C- als auch einen C ++ - Compiler akzeptabel sind, wird der Code im Allgemeinen weder als Beispiel für guten C-Code noch als Beispiel für guten C ++ - Code angesehen.

Bart van Ingen Schenau
quelle
Ich denke nicht, dass der erste Absatz richtig ist. Ich glaube, C hatte immer implizites Casting void *, C ++ jedoch nie. (Hat nicht abgelehnt)
Alternative
5
@mathepic: Definiere "immer". C hat den Typ void * von C ++ übernommen. In K & R C kehrte malloc char * zurück
Nemanja Trifunovic
19

Stroustrup selbst antwortet in seinen FAQ :

C ++ ist ein direkter Nachkomme von C, der fast das gesamte C als Teilmenge beibehält. C ++ bietet eine stärkere Typprüfung als C und unterstützt direkt einen größeren Bereich von Programmierstilen als C. C ++ ist "ein besseres C" in dem Sinne, dass es die mit C durchgeführten Programmierstile mit besserer Typprüfung und mehr Unterstützung für Notationen unterstützt (ohne Verlust) der Effizienz). In demselben Sinne ist ANSI C ein besseres C als K & R C. Darüber hinaus unterstützt C ++ die Datenabstraktion, die objektorientierte Programmierung und die generische Programmierung.

Es unterstützt die objektorientierte Programmierung und die generische Programmierung, die C ++ zu C "völlig anders" macht. Sie können fast reines C schreiben und es dann mit einem C ++ - Compiler kompilieren (solange Sie sich um die strengere Typprüfung kümmern). Aber dann schreiben Sie immer noch C - Sie schreiben nicht C ++.

Wenn Sie C ++ schreiben, nutzen Sie die objektorientierten Funktionen und Vorlagenfunktionen und das entspricht nicht dem, was Sie in C sehen würden.

Dean Harding
quelle
"Das ist nichts wie das, was du in C sehen würdest." Dieser Satz klingt lustig! msgstr "siehe in C". C in C! Das ist eine Art Poesie.
Galaxy
13

Einfach ausgedrückt, was in C als idiomatisch angesehen wird, ist in C ++ definitiv nicht idiomatisch.

C und C ++ sind in der Praxis sehr unterschiedliche Sprachen, weil die Leute sie verwenden. C zielt auf Minimalismus ab, wobei C ++ eine sehr komplexe Sprache mit vielen Funktionen ist.

Es gibt auch einige praktische Unterschiede: C kann leicht aus so gut wie jeder Sprache aufgerufen werden und definiert häufig die ABI einer Plattform, während C ++ aus anderen Bibliotheken nur schwer zu verwenden ist. Die meisten Sprachen haben eine FFI oder Schnittstelle in C, sogar Sprachen, die in C ++ implementiert sind (z. B. Java).

David Cournapeau
quelle
4
Es ist nicht nur so, dass C-Code in C ++ nicht idiomatisch ist. Die Codierung im C-Stil ist in C ++ aufgrund der mangelnden Ausnahmesicherheit problematisch .
Dan04
4

Abgesehen von der offensichtlichen Tatsache, dass C ++ objektorientierte Programmierung unterstützt, haben Sie hier Ihre Antwort: http://en.wikipedia.org/wiki/Compatibility_of_C_and_C++

Dieser Artikel enthält Codebeispiele, die Dinge zeigen, die in C in Ordnung sind, aber nicht in C ++. Zum Beispiel:

int *j = malloc(sizeof(int) * 5); /* Implicit conversion from void* to int* */

Das Portieren eines C-Programms nach C ++ ist oft unkompliziert und besteht hauptsächlich aus dem Beheben von Kompilierungsfehlern (Hinzufügen von Casts, neuen Schlüsselwörtern usw.).

Martin Wickman
quelle
4
Wenn Sie ein solches Programm portieren, erhalten Sie kein C ++ - Programm. Es gibt Ihnen C, das auf C ++ - Compiler kompiliert werden kann. Das macht es nicht zu C ++ (ich würde den resultierenden Code immer noch C nennen (nicht einmal C mit Klassen)).
Martin York
@MartinYork Nenn es schlecht C, weise darauf hin, dass die Semantik möglicherweise anders ist, und ich stimme zu. Das Ergebnis ist natürlich C.
Deduplizierer
2

C ++ erweitert C nicht nur um neue Funktionen, sondern auch um neue Konzepte und Redewendungen. Auch wenn C ++ und C eng miteinander verbunden sind, müssen Sie, um effektiv in einer Sprache zu schreiben, im Stil dieser Sprache denken. Selbst der beste C-Code kann die unterschiedlichen Stärken und Redewendungen von C ++ nicht ausnutzen und ist daher eher ein schlechter C ++ - Code.

Jon Purdy
quelle
2

Die "erweiterten Funktionen" lassen es so klingen, als würden sie in C ++ verschiedene Makros oder ähnliches hinzufügen und das wars. Die "erweiterten Funktionen" in C ++ sind eine vollständige Überarbeitung der Sprache und ersetzen die bewährten C-Methoden vollständig, da die neuen C ++ - Funktionen so viel besser sind als die ursprünglichen C-Funktionen, dass die ursprünglichen C-Funktionen in den allermeisten Fällen vollständig und vollständig überflüssig sind . Die Annahme, dass C ++ lediglich C erweitert, deutet darauf hin, dass ein moderner Kampfpanzer ein Buttermesser für Kriegszwecke erweitert.

DeadMG
quelle
Können Sie ein Beispiel für eine der nützlichsten Funktionen aufzuzählen , dass C ++ hat , dass C nicht?
Dark Templar
2
@DarkTemplar: Wie wäre es einfach Modus Ressourcenmanagement mit RAII? Oder schön generische Datenstrukturen mit Hilfe von Vorlagen? Nur zu beginnen.
DeadMG
1

Der Unterschied ist, dass in C denken Sie prozedural und in C ++ denken Sie in einer objektorientierten Art und Weise. Die Sprachen sind sehr ähnlich, aber der Ansatz ist sehr unterschiedlich.

Ameise
quelle
Nicht C auch structs haben? Sind C-Dateien nicht selbst separate Module (im Grunde Objekte)? Nicht sicher , was der genaue Unterschied zwischen Verfahrens- und objektorientiert ist ...
Dunkle Templer
1
Dunkeln Sie haben meinen Punkt dargestellt. Es ist keine Einschränkung der Sprache, die es Ihnen ermöglicht, prozedural oder objektorientiert zu schreiben. Es ist ein Ethos oder eine Denkweise.
Ant
0

Während C ++ syntaktisch gesehen eine Supermenge von C sein kann - dh jedes Konstrukt eines C-Programms kann vom C ++ - Compiler kompiliert werden.

Sie schreiben jedoch fast nie ein C ++ - Programm so, wie Sie es mit einem C-Programm getan hätten. Die Liste kann endlos sein oder es kann jemand sein, der mehr Nachforschungen anstellt, um sie als ausführliche Berichte zu formulieren. Ich stelle jedoch nur wenige Hinweise vor, die die wesentlichen Unterschiede ausmachen.

Der Punkt des aktuellen Beitrags ist, dass C ++ die folgenden Funktionen hat, die ein guter C ++ - Programmierer als Best Practices für die Programmierung verwenden muss, obwohl es möglich ist, C-Äquivalente zu kompilieren.

Wie soll es in C ++ über C gemacht werden

  1. Klassen & Vererbung. Das sind die wichtigsten Unterschiede, die eine systematische Objektorientierung ermöglichen, die den Programmierausdruck sehr leistungsfähig macht. Ich denke, dieser Punkt bedarf keiner besseren Erklärung. Wenn Sie in C ++ arbeiten, ist es fast immer besser, Klassen zu verwenden.

  2. Privatisierung - Klassen und sogar Strukturen haben private Mitglieder. Dies macht Verkapselung einer Klasse möglich. Das Äquivalent in C ist die Typumwandlung des Objekts als ungültig * für die Anwendung, sodass die Anwendung keinen Zugriff auf interne Variablen hat. In C ++ können Sie jedoch Elemente sowohl mit öffentlichen als auch mit privaten Klassen haben.

  3. Pass Bezug genommen wird . C ++ ermöglicht Änderungen basierend auf Verweisen, für die das Übergeben von Zeigern erforderlich ist. Durch das Pass-by-Reference-Verfahren wird der Code sehr sauber und vor Zeigergefahren sicherer. Sie übergeben auch einen Zeiger im C-Stil und das funktioniert - aber wenn Sie in C ++ sind, sind Sie besser dran, solange

  4. new & delete vs. malloc und kostenlos. Die Anweisungen new () und delete () weisen nicht nur Speicher zu und geben Speicher frei, sondern ermöglichen auch die Ausführung von Code als Teil des Destruktors, der in einer Kette aufgerufen werden soll. Wenn Sie C ++ verwenden - es ist eigentlich BAD zu verwenden malloc und kostenlos.

  5. IO-Typen und Betreiber Überlastung Operator Überlastung make Code lesbar oder intuitiver, wenn gut gemacht. Gleiches gilt für die Operatoren << und >> io. Die C-Methode hierfür wäre die Verwendung von Funktionszeigern - dies ist jedoch unübersichtlich und nur für fortgeschrittene Programmierer.

  6. Mit "string". Das Zeichen * von C funktioniert überall. C und C ++ sind also ziemlich gleich. Wenn Sie sich jedoch in C ++ befinden, ist es immer viel besser (und sicherer), String-Klassen zu verwenden, die Sie vor den Gefahren bewahren, die ein Überlaufen von Arrays mit fast allen Dingen mit sich bringt.

Features, die ich in C ++ 1 immer noch nicht mag. Templates - Obwohl ich in vielen Codes keine umfangreichen Templates verwende, kann es sich für Bibliotheken als sehr leistungsfähig herausstellen. Es gibt fast kein Äquivalent davon in C. Aber an einem normalen Tag - besonders , wenn Sie mathematisch tun fehlt.

  1. Intelligente Zeiger - Ja, sie sind sehr intelligent! Und wie die meisten schlauen Dinge - sie fangen gut an und werden später chaotisch! Ich glaube nicht, ganz wie zu verwenden

Dinge, die ich an C mag und in C ++ vermisse

  1. Polymorphe Algorithmen unter Verwendung von Funktionszeigern. In C, wenn Sie komplexe Algorithmen laufen - einige Male können Sie Reihe von Funktionszeiger verwenden. Dies macht echten Polymorphismus auf mächtige Weise. Wenn Sie in C ++ sind Sie CAN - Funktionszeiger verwenden - aber das ist schlecht. Sie sollten nur Methoden anwenden - sonst sollten Sie darauf vorbereitet sein, chaotisch zu werden. Die einzige Form des Polymorphismus in C ++ - Klassen ist das Überladen von Funktionen und Operatoren, aber das ist ziemlich einschränkend.

  2. Einfache Fäden. Beim Erstellen Fäden pThreads waren - es ist ganz einfach und überschaubar. Es wird, wenn Sie Threads erstellen müssen, die für die Klassen "privat" sein sollen (damit sie Zugriff auf private Mitglieder haben). Es gibt Boost- Frameworks - aber nichts in C ++.

Dipan.

Dipan Mehta
quelle
0

Bestimmte Sprachfunktionen, auch wenn sie Ergänzungen sind, können die ganze Art und Weise ändern, die Sprache praktisch verwendet werden muss. Als ein Beispiel betrachten diesen Fall:

lock_mutex(&mutex);

// call some functions
...

unlock_mutex(&mutex);

Wenn die obigen Codefunktionen in C implementiert beteiligt Aufruf ++, könnten wir in einer Welt von Schwierigkeiten, wie eine dieser Funktionsaufrufe werfen kann, und wir werden nie den Mutex in den Ausnahmeweg freischalten.

Destruktoren sind nicht länger praktisch, um Programmierern zu helfen, zu diesem Zeitpunkt nicht zu vergessen, Ressourcen freizugeben. RAII wird zu einer praktischen Anforderung, da es aus menschlicher Sicht nicht machbar ist, jede einzelne Codezeile zu antizipieren, die nicht-triviale Beispiele enthalten kann (ganz zu schweigen davon, dass diese Zeilen möglicherweise nicht jetzt, sondern möglicherweise später mit Änderungen ausgegeben werden). Nehmen Sie ein anderes Beispiel:

void f(const Foo* f1)
{
    Foo f2;
    memcpy(&f2, f1, sizeof f2);
    ...
}

Solcher Code ist zwar in C im Allgemeinen harmlos, aber in C ++ ist er wie ein Höllenfeuer, weil die memcpyBulldozer über die Bits und Bytes dieser Objekte hinweggehen und Dinge wie Kopierkonstruktoren umgehen. Solche Funktionen wie memset, realloc, memcpyusw., während tägliche Werkzeuge unter den Entwicklern C verwendet , die Dinge in eine ziemlich homogenen Art und Weise von Bits zu suchen und Bytes im Speicher ist nicht harmonisch mit dem immer komplexen und reichem Typ - System von C ++. C ++ unterstützt eine viel abstraktere Sicht auf benutzerdefinierte Typen.

Auf diese Weise kann C ++ für jeden, der es richtig verwenden möchte, nicht mehr als bloße "Obermenge" von C betrachtet werden. Diese Sprachen erfordern eine ganz andere Denkweise, Disziplin und Denkweise, um es am effektivsten einsetzen zu können .

Ich bin nicht in dem Lager, das C ++ in jeder Hinsicht als besser ansieht, und tatsächlich sind die meisten meiner Lieblingsbibliotheken von Drittanbietern aus irgendeinem Grund C-Bibliotheken. Ich weiß nicht genau warum, aber C-Bibliotheken sind in der Regel eher minimalistisch (vielleicht, weil die Entwickler aufgrund des Fehlens eines so umfangreichen Typsystems mehr auf die Bereitstellung der erforderlichen Minimalfunktionalität fokussiert sind, ohne große und vielschichtige Abstraktionen zu erstellen). Obwohl ich sie oft nur mit C ++ - Wrappern umhülle, um ihre Verwendung für meine Zwecke zu vereinfachen und anzupassen, ist mir diese minimalistische Natur selbst dann vorzuziehen. Ich liebe Minimalismus wirklich als attraktives Merkmal einer Bibliothek für diejenigen, die sich die zusätzliche Zeit nehmen, um nach solchen Eigenschaften zu suchen, und vielleicht neigt C dazu, dies zu fördern.

Ich für C ++ weit mehr als oft nicht, aber ich bin eigentlich für die größte binäre Kompatibilität zu verwenden C-APIs eher häufig erforderlich (und für FFI), obwohl ich sie oft in C implementieren ++ trotz C für die Header verwendet wird. Aber manchmal, wenn Sie wirklich Low-Level gehen, wie auf das Niveau eines Speicherzuordner oder sehr Low-Level-Datenstruktur (und ich bin sicher, es gibt weitere Beispiele unter denen, die Programmierung tun eingebettet), kann es manchmal hilfreich sein, zu sein davon ausgehen können, dass die Typen und Daten, die Sie gerade arbeiten fehlen bestimmte Funktionen wie vtables, costructors und Destruktoren, so dass wir sie als Bits behandeln können und Bytes mischen um, kopieren, frei, neu zuweisen. Bei ganz besonders einfachen Problemen kann es manchmal hilfreich sein, mit einem viel einfacheren Typensystem zu arbeiten, das C bereitstellt.

Eine Klarstellung

Ein interessanter Kommentar hier wollte ich ein wenig mehr in die Tiefe reagieren (finde ich die Kommentare hier sind so streng auf Zeichen):

memcpy(&f2, f1, sizeof f2); ist auch "Höllenfeuer herrschende Verwüstung" in C, wenn Foo irgendwelche Zeiger besitzt, oder ist noch schlimmer, da Ihnen auch die Werkzeuge fehlen, um damit umzugehen.

Das ist ein wichtiger Punkt , aber alles , was ich bin konzentriert um überwiegend mit einem Fokus auf C ++ 's - Typ - System und auch in Bezug auf RAII. Einer der Gründe, warum solche röntgenbasierten Bytekopien memcpyoder qsortFunktionstypen in C eine geringere praktische Gefahr darstellen, besteht darin, dass die Zerstörung von f1und f2darüber explizit erfolgt (wenn sie sogar eine nicht-triviale Zerstörung erfordern), während Destruktoren ins Bild rücken werden sie implizit und automatisiert (oft mit großem Wert für die Entwickler). Das ist nicht zu erwähnen sogar Staat wie vptrs versteckt und so weiter , die solche Funktionen direkt über planieren würden. Wenn f1besitzt Zeiger undf2seichtes kopiert sie in einem temporären Kontext, dann stellt es kein Problem, wenn wir versuchen, nicht explizit ein zweites Mal diejenigen besitzen Zeiger zu befreien. In C ++ ist dies etwas, was der Compiler automatisch tun möchte.

Und das wird in der Regel größer, wenn in C " Wenn Foo über eigene Zeiger verfügt", da die bei der Ressourcenverwaltung erforderliche Explizite häufig dazu führt, dass etwas in der Regel schwerer zu übersehen ist, während in C ++ ein UDT nicht mehr trivial ist Konstruierbar / zerstörbar, indem nur eine Elementvariable gespeichert wird, die nicht einfach konstruierbar / zerstörbar ist (auf eine Art und Weise, die im Allgemeinen wiederum sehr hilfreich ist, aber nicht, wenn wir versucht sind, Funktionen wie memcpyoder zu verwenden realloc).

Mein Hauptziel ist es nicht, zu versuchen, irgendeinen Nutzen aus dieser Aussage zu ziehen (ich würde sagen, wenn es welche gibt, werden sie fast immer durch die Nachteile der damit verbundenen erhöhten Wahrscheinlichkeit menschlicher Fehler belastet), sondern nur, dies zu sagen funktioniert wie memcpyund memmoveund qsortund memsetundreallocund so weiter haben keinen Platz in einer Sprache mit UDTs, die so reich an Funktionen und Fähigkeiten sind wie C ++. Ich denke, es wäre nicht zu bestreiten, zu behaupten, dass die überwiegende Mehrheit der C ++ - Entwickler klug wäre, Funktionen wie die Pest zu vermeiden, obwohl dies in C sehr alltägliche Funktionen sind. ' d argumentiert, dass sie weniger Probleme in C aus dem einfachen Grunde darstellen, dass seine Art System viel mehr grundlegenden und vielleicht „stumme“. Das Röntgen von C-Typen und deren Behandlung als Bits und Bytes ist fehleranfällig. Das in C ++ zu tun, ist wohl völlig falsch, weil solche Funktionen gegen sehr grundlegende Merkmale der Sprache und das, was sie vom Typensystem fördert, ankämpfen.

Das ist jedoch für mich der größte Reiz von C, insbesondere in Bezug auf die Interoperabilität von Sprachen. Es wäre viel, viel schwieriger, so etwas wie C # 's FFI dazu zu bringen, das vollständige Typsystem und die Sprachfunktionen von C ++ zu verstehen, bis hin zu Konstruktoren, Destruktoren, Ausnahmen, virtuellen Funktionen, Funktions- / Methodenüberladung, Operatorüberladung und all den verschiedenen Arten von Vererbung usw. Bei C handelt es sich um eine relativ langweilige Sprache, die in Bezug auf APIs zum Standard geworden ist, da viele verschiedene Sprachen direkt über FFIs oder indirekt über einige C-API-Exportfunktionen in einer gewünschten Form (z. B. Java Native Interface) importiert werden können ). Und das ist, wo ich meistens links bin keine andere Wahl hat, aber C zu verwenden, da diese Sprache Interoperabilität eine praktische Anforderung in unserem Fall ist (obwohl ich oft‘

Aber weißt du, ich bin ein Pragmatiker (oder zumindest bemühe ich mich, es zu sein). Wenn C das Foul und godawful war, fehleranfällig, böse Sprache einige meiner C ++ Enthusiasten Kollegen behauptet, es zu sein (und ich würde mich für einen C ++ Enthusiasten, außer dass irgendwie hat es nicht auf meinen Teil zu einem Hass auf C führen , im Gegenteil in ihrer eigenen Beziehung und Unterschiede), dann würde ich erwarten, dass zu zeigen, bis in der realen Welt in Form von einigen der buggiest und leakiest hatte es auf mich den gegenteiligen Effekt macht mich beide Sprachen besser zu schätzen wissen und unzuverlässige Produkte und Bibliotheken, die in C geschrieben sind. Und das finde ich nicht. Ich mag Linux, ich wie Apache, Lua, zlib, finde ich OpenGL erträglich für seine lange Tradition gegen eine solche Verschiebung Hardware-Anforderungen, Gimp, libpng, Kairo, usw. Zumindest was Hürden die Sprach Posen scheinen nicht Sackgassen zu stellen, soweit einige coolen Bibliotheken und Produkte in kompetenten Händen zu schreiben, und das ist wirklich alles mir interessieren. So habe ich noch nie der Typ so interessiert in den leidenschaftlichsten gewesen Sprache Kriege, es sei denn, eine pragmatische Berufung zu machen und sagen: „Hey, es gibt coole Sachen da draußen! Lasst uns lernen, wie sie es gemacht und vielleicht gibt es kühle Unterricht, nicht so spezifisch auf die idiomatischen Natur der Sprache, die wir zurückbringen kann für welche Sprache (n) wir auch immer verwenden. " :-D

Drachen Energie
quelle
2
memcpy(&f2, f1, sizeof f2);ist auch "Höllenfeuer herrschende Verwüstung" in C, wenn Fooes irgendwelche Zeiger gibt, oder ist sogar noch schlimmer, da Ihnen auch die Werkzeuge fehlen, um damit umzugehen. So können die Leute C Schreiben nicht tun , Dinge wie , dass so viel
Caleth
@Caleth Manches, was mit dem Besitz Zeiger vereinfacht , dass auch die ausdrückliche Befreiung des Besitz Zeigers ist, so dass es effektiv eine flache Kopie in solchen Fällen verwandelt sich in noch mit nur einem Ort , um den ursprünglichen Speicher freigegeben werden kann , zum Beispiel (in einigen Fällen, abhängig von das Design). Während bei der Beteiligung von Destruktoren, beide Fookönnen Instanzen nun wollen die dynamische Array zerstören oder einen Vektor, oder etwas zu diesem Effekt. In einigen besonderen Fällen finde ich häufig, dass es hilfreich ist, bestimmte Datenstrukturen zu schreiben, um sich auf die Tatsache zu stützen, dass die Zerstörung explizit und nicht implizit ist.
Drachen Energie
@Caleth Es ist zugegebenermaßen eine faulere Sache von meiner Seite, da Foowir, wenn wir Zeiger besitzen, eine korrekte Kopie / Verschiebung von ctor, dtor, Verwendung von Wertsemantik usw. vornehmen und viel umfangreicheren und sichereren Code haben könnten. Aber gelegentlich greife ich nach C, wenn ich eine Datenstruktur oder einen Allokator auf der homogenen Ebene von Bits und Bytes verallgemeinern möchte, wobei ich bestimmte Annahmen treffen kann, welche Typen in ihren engen Anwendungsfällen zu einer Vereinfachung neigen Ein bisschen durch solche Annahmen fühle ich mich ein bisschen sicherer in C.
Dragon Energy
@Caleth In meinem Fall gibt es jedoch gelegentlich einen Eckpfeiler der Architektur, bei dem es nicht sinnvoll ist, Dinge als mehr als Bits und Bytes im Speicher zu betrachten, um sie anzuordnen und darauf zuzugreifen (und in der Regel handelt es sich bei diesen Fällen nur um PODs). Dies sind die wenigen besonderen Fälle, in denen ich immer noch C bevorzuge. Wenn Sie sich einen Speicherzuweiser vorstellen, gibt es eigentlich nichts mehr, mit dem Sie arbeiten können als Bits und Bytes, leere Zeiger und solche Dinge, bei denen alles auf das Ausrichten und Bündeln ausgerichtet ist und das Verteilen von Bits und Bytes, und in diesen ganz besonderen Fällen finde ich, dass C weniger Hindernisse bietet als C ++.
Dragon Energy
Der andere Fall, in dem ich manchmal nach C greife, sind Fälle, in denen der Code tatsächlich verallgemeinerter und wiederverwendbarer wird, indem er weniger abstrakt ist und sich auf Grundelemente konzentriert, wie zum API void filter_image(byte* pixels, int w, int h);Beispiel ein einfaches Beispiel, anstatt wie API void filter_image(ImageInterface& img);(was unseren Code an eine solche Bildschnittstelle koppeln würde). Einschränkung der Anwendbarkeit). In solchen Fällen implementiere ich manchmal nur solche Funktionen in C, da in C ++ wenig zu gewinnen ist und dies die Wahrscheinlichkeit verringert, dass ein solcher Code zukünftige Änderungen benötigt.
Dragon Energy