2011-01-01 8 views
10

C und C++ sind verschiedene Sprachen, blababla das wissen wir.Warum ist C++ abwärtskompatibel mit C? Warum gibt es keine "reine" C++ - Sprache?

Aber wenn diese Sprache anders ist, warum ist es dann noch möglich, Funktionen wie malloc oder free zu verwenden? Ich bin sicher, es gibt alle Arten von staubigen Dingen, die C++ wegen C hat, aber da C++ eine andere Sprache ist, warum nicht diese Dinge entfernen, um es ein bisschen weniger aufzublähen und sauberer und klarer zu machen?

Liegt es daran, dass es Programmierern ermöglicht, ohne das OO-Modell zu arbeiten, oder weil einige Compiler abstrakte abstrakte Features von C++ nicht unterstützen?

+5

Ein wenig C++ Geschichte: http://www.hitmill.com/programming/cpp/cppHistory.html – miku

Antwort

15

Über "Warum gibt es keine" reine "C++ Sprache ... Nun, es gibt mindestens eine. Die beliebteste heißt D, sie ist großartig, gut gestaltet, funktionsreich, angenehm zu kodieren und Sie können C-Bibliotheken mit verwenden.

Ah, und fast niemand nutzt es. :)

der direkte Grund ist, dass C++ nicht schlimm genug ist, einen guten Grund zu portieren Millionen Zeilen ihr Erbe zu geben Menschen Code zu moderner, und wie Sie beschrieben, "reine" Sprachen wie D.

+6

Dies beantwortet nicht die Frage nach der Beziehung zwischen C und C++ und verstopft stattdessen eine andere Sprache. –

+4

Nun, da ist der zweite Teil der Frage, auf den ich mich direkt bezogen habe. – Kos

+3

D ist interessant, aber ich würde es nicht als "reines C++" bezeichnen ... es ist eine andere Sprache mit vielen gleichen Zielen und ohne das alte C-Gepäck. – dajames

22

Weil C++ wäre sofort tot, wenn es nicht kompatibel zu C wie es jetzt ist. Niemand, außer den Fanboys, würde C++ mögen, wenn es nicht mit C kompatibel wäre. (Ich weiß, dass ich wahrscheinlich dafür abgemeldet werde. Sei es so!).

+6

Hat C++ überhaupt irgendwelche Fanboys? – Kos

+3

@Kos: Nein. Keine ... –

+3

@Johannes: Ich muss widersprechen. Sprachen wie Java und C# sind ohne jegliche direkte C-Kompatibilität wie C++ in Ordnung. – Puppy

7

Es ist so konzipiert, dass Sie C-Code portieren und als C++ - Code direkt kompilieren können, und es allo ws für die schrittweise Aktualisierung des vorhandenen Codes. Wenn C++ nicht über malloc/free verfügte, konnten Sie den vorhandenen C-Code nicht als C++ kompilieren, da Sie einige schlechte shmuck bezahlen müssten, um alle malloc-Aufrufe zu finden und sie zu ersetzen, was teuer ist.

+1

Nit ausgewählt: C++ hat * malloc nicht und 'free', es * unterstützt * sie, weil sie Teil der c-Standard-Bibliothek nicht Sprache Schlüsselwörter sind. Aber so oder so ein wichtiger Punkt. – dmckee

3

Die frühen Versionen von C++ wurden auf C aufgebaut, und tatsächlich übersetzte der Compiler C++ - Code in C, der wiederum vom lokalen C-Compiler kompiliert wurde. Bjarne Stroustrup ist ein großer Befürworter der Rückwärtskompatibilität und würde, ich bin mir sicher, jedem Versuch widerstehen, die Funktionalität wegzunehmen.

Sie können alles über in Bjarne Buch The Design and Evolution of C++ lesen.

4

Ich schlage vor, Sie werfen einen Blick auf The Design & Evolution of C++, um ein besseres Gefühl für den Grund zu bekommen, warum die Sprache so ausgegangen ist, wie es ist. Es gibt historische Gründe, warum C++ aus C hervorging und rückwärtskompatibel zu C gemacht wurde.

5

C++ wurde entwickelt, um mit C kompatibel zu sein - eigentlich war es ursprünglich eine Obermenge von C, aber die C-Sprache hat sich geändert, um das zu brechen.

Dies bedeutet, dass C-Bibliotheken - einschließlich der C-Laufzeitbibliothek - aus C++ - Code aufgerufen werden können. Es tut nicht bedeuten, dass es eine gute Idee ist, dies zu tun!

Wenn Sie ein "reines" C++ wollen, dann können Sie einfach C++ verwenden, ohne C-Bibliotheken aufzurufen.

[Wie andere gesagt haben, da ich diese Eingabe gestartet. The Design & Entwicklung von C++ ist ein guter Ort auf dieser für den Hintergrund zu lesen beginnen]

+1

Beachten Sie, dass es nie eine reine Obermenge von C war - es gibt ein paar kleine Unterschiede aufgrund von Schlüsselwörtern, der Größe eines Buchstabenliterals usw. – me22

+0

Oh .. sizeof ein Zeichenliteral? Was hat sich damit verändert? – Kos

+0

char ist int in c. 'sizeof (char)' ist 4 in c, aber 1 in C++. – Tim

7

Die meisten Betriebssysteme eine C-API aussetzen, wenn Sie also Möchten Sie C++ für die Systemprogrammierung verwenden, benötigen Sie ein gewisses Maß an C-Interoperabilität.

Dass die C-Standardbibliothek in die C++ - Standardbibliothek aufgenommen wurde, hat historische und praktische Gründe: C++ begann seine Lebensdauer als eine Erweiterung von C, und die C-Standardbibliothek war bereit zu verwenden. Es wäre albern, einen Teil der Bibliothek auszuschließen (wie malloc und free), nur weil es mehr idiomatische C++ - Alternativen gibt: Wenn Sie dumme Dinge tun wollen, gibt Ihnen C++ die Macht, dies zu tun.

Für die eigentliche Sprachsemantik gilt das gleiche - aber in geringerem Maße - und aus Gründen der Abwärtskompatibilität kann C++ niemals vollständig frei von C-Erben sein.

1

Es gab viele mehr reine Sprachen. Sie wurden jedoch nicht weit verbreitet, weil sie zu weit außerhalb des Komforts der meisten Programmierer lagen. C++ erlaubte andererseits Programmierern, langsam zu wachsen, indem sie C-Stile erlaubten.

Was Sie tun, ist Sprachen wie C# oder Python zu betrachten und fragen, warum C++ nicht wie sie aussieht, aber vergessen, dass dort Schritte erforderlich wie C++ und Java oder Awk und Perl.

Um ein Zitat anzupassen, hörte ich früher: C# ist Microsofts Version von Suns For-Idiots-Version von Bells Version von C-enhanced-by-Simula.

1

Alle sind richtig. Um es zusammenzufassen: Der Grund ist Politik. Wenn Sie möchten, dass etwas populär wird, verbessern Sie etwas, das bereits populär ist, und Sie haben einen bereiten Markt. Entwerfen Sie etwas Neues und niemand wird daran interessiert sein, es sei denn, Sie sind Sun, entwerfen einen Haufen Mist, sondern werfen Milliarden von Dollar in die Entwicklung und das Marketing von Bibliotheken.

1

malloc() und free() sind erforderlich, damit Sie in C-Sprachenbibliotheken aus C++ - Code aufrufen können. Die C-Sprachenbibliothek gibt möglicherweise einen Zeiger auf Speicher zurück, der mit malloc() reserviert ist, das von dem Aufrufer mit free() freigegeben werden muss; oder, weniger häufig, könnte es einen Zeiger auf Speicher erfordern, der mit malloc() zugewiesen wird, dass es intern mit oder frei mit free() neu zuweisen kann.

Verwandte Themen