Ich bin ein Anfänger-C ++ - Programmierer, aber ich verstehe die Konzepte der Sprache ziemlich gut. Als ich anfing, externe C ++ - Bibliotheken wie SDL, OpenGL (vielleicht auch etwas anderes) zu lernen, stellte ich zu meiner großen Überraschung fest, dass sie überhaupt keine C ++ - Konzepte verwenden.
Beispielsweise verwenden weder SDL noch OpenGL Klassen oder Ausnahmen, die Funktionen und Fehlercodes bevorzugen. In OpenGL habe ich Funktionen wie glVertex2f gesehen, die 2 Float-Variablen als Eingabe nehmen und wahrscheinlich besser als Vorlage wären. Darüber hinaus verwenden diese Bibliotheken manchmal Markos, während es allgemein üblich zu sein scheint, dass die Verwendung von Makros schlecht ist.
Alles in allem scheinen sie eher im C-Stil als im C ++ - Stil geschrieben zu sein. Aber es sind ganz andere, inkompatible Sprachen, nicht wahr?
Die Frage ist: Warum nutzen moderne Bibliotheken nicht die Vorteile der Sprache, in der sie geschrieben sind?
quelle
Antworten:
Sowohl OpenGL als auch SDL sind C-Bibliotheken und stellen eine C-Schnittstelle für den Rest der Welt zur Verfügung (da so ziemlich jede Sprache auf dem Markt mit C kommunizieren kann, aber nicht unbedingt mit C ++). Sie sind daher auf die von C bereitgestellte prozedurale Schnittstelle und die C-Methode zum Deklarieren und Verwenden von Datenstrukturen beschränkt.
Abgesehen von dem Aspekt der "Schnittstelle mit anderen Sprachen", den eine C-Schnittstelle bietet, ist C im Allgemeinen ein bisschen portabler als C ++, was es wiederum einfacher macht, den nicht plattformabhängigen Teil des Bibliothekscodes abzurufen wie diese auf einem anderen Betriebssystem oder einer anderen Hardwarearchitektur arbeiten. So ziemlich jede Plattform hat einen anständigen C-Compiler, aber es gibt immer noch einige, die eingeschränkte C ++ - Compiler haben oder solche, die einfach nicht sehr gut sind.
Während C und C ++ sehr unterschiedliche Sprachen sind, sind sie in der Tat nicht "inkompatibel". C ++ ist eine Obermenge von C. Es gibt einige Inkompatibilitäten, aber nicht viele. Daher ist die Verwendung einer C-Schnittstelle von C ++ eine sehr einfache Sache machen.
quelle
float3
s, weil die gesamte Hardware mit Arrays von Floats befasst ist. Die "Klassen" -Struktur (die Vorstellung, dass ein Vektor 2, 3 oder 4 Floats ist) ist alles implizit in der Art und Weise, wie die Karte angewiesen wird, auf ihren Speicherhaufen zuzugreifen. Es mag schön sein, beim Programmieren von Grafiken in Klassen nachzudenken, aber meiner Meinung nach ist diese Art von Arbeit der Hardware nahe genug, dass es eher ein Ärger ist, als die schmutzigen Details der Implementierung zu abstrahieren.Ich denke, Sie sind verwirrend, "eine Bibliothek zu schreiben" gegen "API nach außen auszusetzen". Ich weiß nicht viel über die Bibliotheken, die Sie erwähnt haben (sie sind möglicherweise intern in C geschrieben), aber ich weiß, dass viele andere, auch ich, C ++ - Bibliotheken / Frameworks geschrieben haben, die alle Arten von ausgefallenen OOP-Praktiken / Mustern voll ausnutzen , aber immer noch C-API nach außen ausgesetzt.
In der Vergangenheit habe ich mich als Experiment in einem der Projekte bei der Arbeit entschieden, "OO" -Schnittstelle aus einer C ++ - DLL verfügbar zu machen. Um interne Details zu verbergen und viele andere Dinge zu vermeiden, habe ich Windows COM (Komponentenobjektmodell) fast neu erfunden. Nach diesem Projekt wurde mir klar, dass COM nicht so schlimm ist, wie die Leute glauben, weil a) es OOP-Schnittstellen offenlegt, b) sich um alle Probleme kümmert, auf die ich gestoßen bin, und c) Standard genug ist, um von einer Reihe von Konsumenten konsumiert zu werden andere Sprachen.
Aber COM ist immer noch nicht ohne Gepäck. In vielen Fällen ist die reguläre Plan-C-API immer noch eine viel bessere Alternative.
quelle
Sowohl OpenGL als auch SDL sind C-Bibliotheken, keine C ++ - Bibliotheken. Sie können sie von C ++ aus verwenden, aber sie sind in C geschrieben und verfügen über eine C-API (auf die auch in anderen Sprachen zugegriffen werden kann; C ++ ist ein Problem für den Zugriff über ein FFI). Werfen Sie einen Blick auf Boost für eine große Anzahl allgemeiner (und einiger spezialisierter) C ++ - Bibliotheken und auf SFML für eine C ++ - Multimediabibliothek.
quelle
OpenGL war ursprünglich Teil eines Stapels von APIs - OpenGL bot eine leistungsorientierte API auf niedriger Ebene, auf die über C (oder Fortran) zugegriffen werden konnte, während OpenInventor eine objektorientierte API auf hoher Ebene bereitstellte Es kann in C ++ verwendet werden und bietet sowohl eine hochrangige API für Szenendiagramme als auch Abstraktionen zum Speichern / Lesen von Szenen in / aus Dateien und zur GUI-Integration.
OpenGL ging viel weiter als OpenInventor (es erfüllte ein dringenderes Bedürfnis, gab Videohardwareherstellern Optimierungsbedarf und stellte ein allgemeines Low-Level-API-Ziel bereit, anstatt sich direkt mit 3D-Beschleunigungshardware zu befassen). Aber OpenInventor ist immer noch da und es gibt eine gute Open-Source-Implementierung - Coin3D - mit Unterstützung für Unix / X11, Windows und MacOS X / Cocoa.
quelle
Diese Bibliotheken sind überhaupt nicht entfernt modern. Sie sind C-APIs und auch schlechte. Ihre Prämisse ist fehlerhaft.
quelle