Diğer cevaplara biraz farklı bir bakış açısı sağlamak amacıyla, ben böyle cevaplayacağım.
(Feragatname: Bazı şeyleri biraz basitleştiriyorum, verdiğim durum tamamen varsayımsal ve hayata% 100 gerçek olmaktan ziyade kavramları göstermenin bir aracı olarak yazılıyor).
Diğer perspektiften düşünün, temel iş parçacığı, pencereleme ve bellek yönetimi özelliklerine sahip basit bir işletim sistemi yazdığınızı hayal edin. Kullanıcıların C ++ programlamak ve pencere yapmak, pencere çizmek vb gibi şeyler yapmak için bir C ++ kitaplığı uygulamak istiyorsunuz. Soru, bunu nasıl yapılır.
İlk olarak, C ++ makine kodunu derlediğinden, C ++ ile arayüz oluşturmak için makine kodunu kullanmanın bir yolunu tanımlamanız gerekir. Burada fonksiyonlar devreye giriyor, fonksiyonlar argümanları kabul ediyor ve dönüş değerleri veriyor, böylece farklı kod bölümleri arasında veri aktarımı için standart bir yol sağlıyorlar. Bunu, bir şey olarak bilinen bir şey kurarak yaparlar. çağıran bir sözleşme .
bir çağıran kongre durumları ve yürütüldüğünde aldığında bir işlev onları bulabilmesi argümanlar bellekte yerleştirilmelidir nasıl. Bir işlev çağrıldığında, çağıran işlev bağımsız değişkenleri belleğe yerleştirir ve CPU'dan diğer işleve atlamasını ister ve burada geri çağrıldığı yere geri dönmeden önce ne yaptığını yapar. Bu, çağrılan kodun kesinlikle herhangi bir şey olabileceği ve işlevin çağrılma biçimini değiştirmeyeceği anlamına gelir. Ancak bu durumda, işlevin arkasındaki kod işletim sistemiyle ilgili olacaktır ve işletim sisteminin dahili durumunda çalışacaktır.
Böylece, aylar sonra tüm işletim sistemi işlevlerinizi çözdünüz. Kullanıcınız pencereler oluşturmak ve üzerlerine çizim yapmak için işlevleri çağırabilir, iş parçacıkları ve her türlü harika şeyleri yapabilir. Sorun şu ki, işletim sisteminizin işlevleri Linux işlevlerinden veya Windows işlevlerinden farklı olacaktır. Bu nedenle, kullanıcıya taşınabilir kod yazabilmeleri için standart bir arayüz vermeniz gerektiğine karar verirsiniz. İşte QT devreye giriyor.
Neredeyse kesin olarak bildiğiniz gibi, QT'nin işletim sistemlerinin yaptığı şeyleri yapmak için birçok temel sınıf ve işlevi vardır, ancak altta yatan işletim sisteminden bağımsız olarak görünür. Bunun çalışma şekli, QT'nin kullanıcıya göründüğü gibi tekdüze sınıflar ve işlevler sağlamasıdır, ancak işlevlerin arkasındaki kod her işletim sistemi için farklıdır. Örneğin, QT'nin QApplication :: closeAllWindows () yöntemi, kullanılan sürüme bağlı olarak her işletim sisteminin özel pencere kapatma işlevini çağırır. Windows'da büyük olasılıkla CloseWindow'u (hwnd), X Pencere Sistemini kullanan bir işletim sisteminde muhtemelen XDestroyWindow'u (ekran, pencere) çağırır.
Açıkça görüldüğü gibi, bir işletim sisteminin birçok katmanı vardır, bunların hepsi birçok çeşidin arayüzleri aracılığıyla etkileşime girmelidir. Dokunmadım bile pek çok yönü var, ama hepsini açıklamak çok uzun zaman alacaktı. İşletim sistemlerinin iç işleyişi ile ilgileniyorsanız, OS dev wiki'ye göz atmanızı öneririz .
Bununla birlikte, birçok işletim sisteminin arayüzleri C / C ++ 'a maruz bırakmayı seçmesinin sebebinin makine koduna derlenmeleri, montaj talimatlarının kendi kodlarıyla karıştırılmasına izin vermeleri ve programcıya büyük ölçüde özgürlük sağlamaları gerektiğini unutmayın.
Yine, burada çok şey oluyor. .So ve .dll dosyaları gibi kitaplıkların C / C ++ ile nasıl yazılması gerekmediğini ve derleme veya diğer dillerde yazılabileceğini açıklamak istiyorum, ancak daha fazla eklersem de bir makalenin tamamını yazın ve bunu yapmak istediğim kadarıyla üzerinde barındıracak bir sitem yok.