2010-09-14 40 views

Trả lời

2

C++ có thể tương thích với C bằng các khai báo "C" bên ngoài.

7

Boost.Python có các macro đặc biệt khai báo hàm với extern "C" để trình thông dịch Python có thể gọi chúng. Nó khá phức tạp, nhưng bạn có thể xem Boost documentation để biết thêm thông tin.

4

Python khai báo một C-API (xem http://docs.python.org/2/c-api/ hoặc http://docs.python.org/3/c-api/). API này định nghĩa một kiểu đối tượng chung được gọi là PyObject chỉ là cấu trúc C bình thường. Cấu trúc này định nghĩa (gần như) mọi thứ mà một đối tượng python có thể thực hiện, ví dụ, điều gì sẽ xảy ra khi bổ sung hoặc so sánh trên đối tượng này hoặc đơn giản gọi nó như một hàm.

Vì kiểu trăn cũng là đối tượng (và do đó được biểu diễn trong C theo cấu trúc PyObject), việc xác định loại mới là một vấn đề đơn giản để xác định cấu trúc mới PyObject như cấu trúc đó. Khi các phương thức được gọi trong Python, trình thông dịch chuyển tiếp cuộc gọi đến các hàm C được liên kết với cấu trúc này.

Miễn là tiện ích mở rộng được cung cấp cung cấp các điểm nhập chính xác sao cho trình thông dịch Python có thể xem xét nó và tìm hiểu những gì có sẵn (tài liệu tôi đã nêu ở trên giải thích chi tiết), thì có thể sử dụng các đối tượng giống như bất kỳ đối tượng nào khác mà bạn thường có sẵn tại dấu nhắc - mà BTW, được xây dựng bằng cách sử dụng cùng một C-API. Nó đủ cho bạn import phần mở rộng được biên dịch.

Tôi hy vọng nó có phần rõ ràng cách trình thông dịch Python gọi nội dung từ tiện ích mở rộng đã biên dịch từ phía trên. Khoảng cách còn thiếu duy nhất là cách C-API gọi mã C++.

Boost.Python thực hiện điều này bằng cách khai báo các điểm nhập C trong mã dọc theo các dòng như được giải thích tại đây: Elegantly call C++ from C. Mỗi khi bạn gọi, ví dụ: boost::python::class_, nó thực hiện điều này cho loại bạn khai báo thành python, do đó tạo ra một PyObject đại diện cho lớp của bạn, với tên bạn chọn. Khi bạn gọi .def trên lớp này, bạn sẽ điền vào các khe bên trong của cấu trúc đó, khai báo nhiều phương thức, toán tử và thuộc tính của kiểu mới của bạn. Mỗi khe trong này trỏ đến một hàm kiểu C không có gì ngoài một trình bao bọc cho cuộc gọi C++ tương đương.

Các vấn đề liên quan