2010-09-14 108 views

回答

2

C++可以通過extern「C」聲明與C進行互操作。

7

Boost.Python有特殊的宏聲明extern "C"函數,所以Python解釋器將能夠調用它們。這有點複雜,但你可以看看Boost documentation瞭解更多信息。

4

Python聲明瞭C-API(請參閱http://docs.python.org/2/c-api/http://docs.python.org/3/c-api/)。這個API定義了一個名爲PyObject的通用對象類型,它只是一個普通的C結構。這個結構定義了(幾乎)一個python對象可以做的所有事情,例如,當對這個對象進行增加或比較時或者簡單地將它稱爲函數時會發生什麼。因爲python類型也是對象(因此用C表示一個PyObject結構),所以定義一個新類型就像定義一個新的PyObject結構一樣簡單。當在Python中調用方法時,解釋器會將調用轉發給與此結構關聯的C函數。

只要給定的(編譯的)擴展提供了正確的入口點,以便Python解釋器可以反省它並找出可用的東西(我上面指出的文檔沒有詳細解釋這一點),那麼它可以使用這些對象就像通常在提示時可用的任何其他對象一樣 - 順便提一下,這些對象是使用完全相同的C-API構建的。它足夠你編譯的擴展名爲import

我希望有一點清楚Python解釋器如何從上面編譯的擴展中調用東西。唯一的缺失是C-API如何調用C++代碼。

Boost.Python通過在代碼中沿着代碼聲明C入口點來執行此操作,如下所示:Elegantly call C++ from C。每次打電話時,例如boost::python::class_,它都會根據您向python聲明的類型執行此操作,因此會創建代表您的班級的PyObject,並顯示您選擇的名稱。當你在這個類上調用.def時,你需要填充該結構的內部槽,聲明更多方法,運算符和新類型的屬性。這些內部插槽中的每一個都指向一種C風格的函數,它不過是對等效C++調用的封裝。