Trong nỗ lực cung cấp một cái nhìn hơi khác với các câu trả lời khác, tôi sẽ trả lời như thế này.
(Tuyên bố miễn trừ trách nhiệm: Tôi đơn giản hóa mọi thứ một chút, tình huống tôi đưa ra hoàn toàn là giả thuyết và được viết như một phương tiện để chứng minh các khái niệm hơn là đúng 100% với cuộc sống).
Hãy nghĩ về những điều từ quan điểm khác, hãy tưởng tượng bạn vừa viết một hệ điều hành đơn giản với các khả năng quản lý bộ nhớ, cửa sổ và quản lý bộ nhớ cơ bản. Bạn muốn triển khai thư viện C ++ để cho phép người dùng lập trình trong C ++ và thực hiện những việc như tạo cửa sổ, vẽ lên cửa sổ, v.v. Câu hỏi là, làm thế nào để làm điều này.
Đầu tiên, vì C ++ biên dịch thành mã máy, bạn cần xác định cách sử dụng mã máy để giao tiếp với C ++. Đây là nơi các hàm xuất hiện, các hàm chấp nhận các đối số và đưa ra các giá trị trả về, do đó chúng cung cấp một cách truyền dữ liệu tiêu chuẩn giữa các phần khác nhau của mã. Họ làm điều này bằng cách thiết lập một cái gì đó gọi là quy ước gọi .
Một quy ước gọi cho biết vị trí và cách đặt các đối số trong bộ nhớ để một hàm có thể tìm thấy chúng khi nó được thực thi. Khi một chức năng được gọi, chức năng gọi sẽ đặt các đối số vào bộ nhớ và sau đó yêu cầu CPU chuyển sang chức năng khác, nơi nó thực hiện công việc trước khi quay trở lại nơi nó được gọi. Điều này có nghĩa là mã được gọi có thể hoàn toàn là bất cứ thứ gì và nó sẽ không thay đổi cách gọi hàm. Tuy nhiên, trong trường hợp này, mã đằng sau chức năng sẽ có liên quan đến hệ điều hành và sẽ hoạt động trên trạng thái bên trong của hệ điều hành.
Vì vậy, nhiều tháng sau và bạn đã sắp xếp tất cả các chức năng HĐH của mình. Người dùng của bạn có thể gọi các chức năng để tạo các cửa sổ và vẽ lên chúng, họ có thể tạo ra các chủ đề và tất cả các loại điều tuyệt vời. Tuy nhiên, đây là vấn đề, các chức năng của HĐH của bạn sẽ khác với các chức năng của Linux hoặc các chức năng của Windows. Vì vậy, bạn quyết định bạn cần cung cấp cho người dùng một giao diện chuẩn để họ có thể viết mã di động. Đây là nơi mà QT đến.
Như bạn gần như chắc chắn biết, QT có vô số các lớp và hàm hữu ích để thực hiện các loại công việc mà hệ điều hành làm, nhưng theo cách xuất hiện độc lập với hệ điều hành cơ bản. Cách thức hoạt động này là QT cung cấp các lớp và hàm đồng nhất theo cách chúng xuất hiện cho người dùng, nhưng mã đằng sau các hàm này khác nhau đối với mỗi hệ điều hành. Ví dụ: QApplication :: close ALLWindows () của QT thực sự sẽ gọi chức năng đóng cửa sổ chuyên dụng của mỗi hệ điều hành tùy thuộc vào phiên bản được sử dụng. Trong Windows, rất có thể sẽ gọi CloseWindow (hwnd) trong khi trên hệ điều hành sử dụng Hệ thống cửa sổ X, nó có khả năng sẽ gọi XDestroyWindow (hiển thị, cửa sổ).
Rõ ràng, một hệ điều hành có nhiều lớp, tất cả đều phải tương tác thông qua các giao diện của nhiều loại. Có nhiều khía cạnh tôi thậm chí không chạm tới, nhưng để giải thích tất cả chúng sẽ mất một thời gian rất dài. Nếu bạn quan tâm hơn đến hoạt động bên trong của các hệ điều hành, tôi khuyên bạn nên kiểm tra hệ điều hành wiki wiki .
Mặc dù vậy, lý do nhiều hệ điều hành chọn hiển thị giao diện cho C / C ++ là vì chúng biên dịch thành mã máy, chúng cho phép các hướng dẫn lắp ráp được trộn lẫn với mã của riêng chúng và chúng cung cấp một mức độ tự do tuyệt vời cho lập trình viên.
Một lần nữa, có rất nhiều thứ đang diễn ra ở đây. Tôi muốn tiếp tục giải thích làm thế nào các thư viện như các tệp .so và. Không phải viết bằng C / C ++ và có thể được viết bằng ngôn ngữ lắp ráp hoặc các ngôn ngữ khác, nhưng tôi cảm thấy rằng nếu tôi thêm nữa viết toàn bộ bài viết và nhiều như tôi muốn làm là tôi không có trang web để lưu trữ nó.