In dem Versuch, andere Antworten etwas anders zu betrachten, werde ich so antworten.
(Haftungsausschluss: Ich vereinfache die Dinge leicht, die Situation, die ich gebe, ist rein hypothetisch und dient dazu, Konzepte zu demonstrieren, anstatt zu 100% dem Leben treu zu bleiben.)
Stellen Sie sich die Dinge aus einer anderen Perspektive vor. Stellen Sie sich vor, Sie haben gerade ein einfaches Betriebssystem mit grundlegenden Funktionen für Threading, Fensterung und Speicherverwaltung geschrieben. Sie möchten eine C ++ - Bibliothek implementieren, mit der Benutzer in C ++ programmieren und beispielsweise Fenster erstellen, auf Fenster zeichnen usw. Die Frage ist, wie dies zu tun ist.
Da C ++ zu Maschinencode kompiliert wird, müssen Sie zunächst eine Möglichkeit definieren, Maschinencode für die Schnittstelle mit C ++ zu verwenden. Hier kommen Funktionen ins Spiel, Funktionen akzeptieren Argumente und geben Rückgabewerte an. Sie bieten somit eine Standardmethode für die Übertragung von Daten zwischen verschiedenen Codeabschnitten. Sie tun dies, indem sie eine sogenannte Rufkonvention etablieren .
Eine aufrufende Konvention gibt an, wo und wie Argumente im Speicher abgelegt werden sollen, damit eine Funktion sie finden kann, wenn sie ausgeführt wird. Wenn eine Funktion aufgerufen wird, legt die aufrufende Funktion die Argumente im Speicher ab und fordert die CPU auf, zur anderen Funktion zu springen, wo sie das tut, was sie tut, bevor sie dorthin zurückspringt, von wo sie aufgerufen wurde. Dies bedeutet, dass der aufgerufene Code absolut alles sein kann und sich nicht ändert, wie die Funktion aufgerufen wird. In diesem Fall wäre der Code hinter der Funktion jedoch für das Betriebssystem relevant und würde mit dem internen Status des Betriebssystems arbeiten.
Viele Monate später haben Sie alle Funktionen Ihres Betriebssystems erledigt. Ihr Benutzer kann Funktionen aufrufen, um Fenster zu erstellen und darauf zu zeichnen. Er kann Threads und alle möglichen wunderbaren Dinge erstellen. Hier ist das Problem: Die Funktionen Ihres Betriebssystems unterscheiden sich von den Funktionen von Linux oder Windows. Sie müssen dem Benutzer also eine Standardschnittstelle geben, damit er tragbaren Code schreiben kann. Hier kommt QT ins Spiel.
Wie Sie mit ziemlicher Sicherheit wissen, verfügt QT über eine Vielzahl nützlicher Klassen und Funktionen, mit denen Sie die Aufgaben von Betriebssystemen ausführen können, die jedoch unabhängig vom zugrunde liegenden Betriebssystem erscheinen. Dies funktioniert so, dass QT Klassen und Funktionen bereitstellt, die in ihrer Darstellung für den Benutzer einheitlich sind, der Code hinter den Funktionen jedoch für jedes Betriebssystem unterschiedlich ist. Zum Beispiel würde QTs QApplication :: closeAllWindows () tatsächlich die spezielle Fensterschließfunktion jedes Betriebssystems aufrufen, abhängig von der verwendeten Version. In Windows würde es höchstwahrscheinlich CloseWindow (hwnd) aufrufen, während es auf einem Betriebssystem, das das X Window System verwendet, möglicherweise XDestroyWindow (Anzeige, Fenster) aufrufen würde.
Es ist offensichtlich, dass ein Betriebssystem viele Schichten hat, die alle über Schnittstellen vieler Arten interagieren müssen. Es gibt viele Aspekte, die ich noch nicht einmal angesprochen habe, aber es würde sehr lange dauern, sie alle zu erklären. Wenn Sie sich weiter für das Innenleben von Betriebssystemen interessieren, empfehle ich Ihnen, das OS-Entwickler-Wiki zu lesen .
Bedenken Sie jedoch, dass viele Betriebssysteme Schnittstellen für C / C ++ verfügbar machen, weil sie zu Maschinencode kompiliert werden, Assembleranweisungen mit ihrem eigenen Code gemischt werden können und dem Programmierer ein hohes Maß an Freiheit bieten.
Auch hier ist viel los. Ich möchte weiter erklären, wie Bibliotheken wie .so und .dll-Dateien nicht in C / C ++ geschrieben werden müssen und in Assembler oder anderen Sprachen geschrieben werden können, aber ich habe das Gefühl, dass ich es auch tun könnte, wenn ich weitere hinzufüge schreibe einen ganzen Artikel, und so gerne ich das tun würde, ich habe keine Seite, auf der ich ihn hosten könnte.