2009-07-26 98 views
5

Python手冊說你可以在C和C++中爲Python創建模塊。在使用C++時,你能利用諸如類和模板之類的東西嗎?它不會與其他圖書館和翻譯人員造成不兼容嗎?我可以在擴展Python的同時使用C++特性嗎?

+0

查看給出的答案http://stackoverflow.com/q/10368141/151641 – mloskot 2012-05-09 12:28:46

回答

8

無論你的鉤子函數的實現是用C還是用C++實現的都沒關係。事實上,我已經看到了一些積極使用C++模板甚至Boost庫的Python擴展。 沒問題。 :-)

2

您感興趣的是一個名爲SWIG的程序。它將爲C++代碼生成Python包裝和接口。我使用它與模板,繼承,命名空間等,它運作良好。

+0

如果您主要針對C++,那麼SWIG絕對不是您想要使用的工具。如果它只是你正在使用的一小部分,那麼它很好地理解C++來包裝它,但它無法觸及Boost.Python for C++的支持。 – 2009-07-27 00:49:41

+0

@Nick:我查看了Boost :: Python庫,我不相信它是優越的。 Boost使用的所有模板和宏魔法都可能很脆弱,並且限制了代碼的功能。 – 2009-07-27 02:31:12

3

推動人們有一個很好的自動化方式來做Python包裝的C++代碼。

它被稱爲:Boost.Python的

它的一些C++比痛飲,尤其是模板元編程更好地構建的交易。

1

您應該能夠使用C++語言的所有功能。該Extending Python Documentation (2.6.2)說,你可以使用C++,但提到了以下注意事項:

它可以編寫擴展 模塊C++。一些限制 適用。如果主程序(Python 解釋器)編譯並鏈接到 ,則使用C編譯器,全局或靜態的 帶構造函數的對象不能使用 。如果 主程序由C++ 編譯器鏈接,則這不是問題。必須使用 extern「C」來聲明將由Python解釋器調用的 函數(在 特定,模塊初始化 函數中)。 不需要 extern「C」{...} - 如果定義了符號__cplusplus爲 (所有最新的C++編譯器 定義了此符號),則它們使用此格式 。

第一個限制,「與構造全局或靜態對象不能使用」,先後與方式做最C++編譯器初始化這種類型的存儲持續時間的對象。例如,請考慮下面的代碼:

class Foo { Foo() { } }; 

static Foo f; 

int main(int argc, char** argv) {} 

編譯器有讓之前主要被執行的「富」構造函數調用爲「F」發射的特殊代碼。如果Python擴展中存在具有靜態存儲持續時間的對象,則Python解釋器不會被編譯並鏈接到C++,則不會創建此特殊初始化代碼。

第二個限制「必須使用extern」C「聲明將由Python解釋器調用的函數(特別是模塊初始化函數),這與C++名稱修改有關。大多數C++編譯器都會改變它們的名稱,以便它們可以使用爲C工具鏈提供的相同鏈接器。例如說你有:

void a_function_python_calls(void* foo); 

C++編譯器可引用轉換爲名稱「a_function_python_calls」喜歡的東西「a_function_python_calls @ 1VGA」。在這種情況下,當您試圖鏈接到Python庫時,您可能會遇到無法解析的外部問題。

相關問題