Python手册说您可以在C和C ++中为Python创建模块。使用C ++时,您可以利用类和模板之类的东西吗?它不会与其他库和解释器产生不兼容性吗?
答案 0 :(得分:8)
钩子函数的实现是用C还是用C ++实现并不重要。事实上,我已经看到一些Python扩展,它们积极使用C ++模板甚至是Boost库。 没问题。: - )
答案 1 :(得分:3)
增强人员有一个很好的自动方式来包装C ++代码供python使用。
它被称为:Boost.Python
它比SWIG更好地处理C ++的一些构造,特别是模板元编程。
答案 2 :(得分:2)
您感兴趣的是一个名为SWIG的程序。它将为C ++代码生成Python包装器和接口。我将它与模板,继承,命名空间等一起使用,效果很好。
答案 3 :(得分:1)
您应该能够使用C ++语言的所有功能。 Extending Python Documentation (2.6.2)表示您可以使用C ++,但提到以下警告:
可以编写扩展名 C ++中的模块。一些限制 应用。如果是主程序(Python 解释器)由编译和链接 C编译器,全局或静态 具有构造函数的对象不能 用过的。如果这不是问题 主程序由C ++链接 编译器。功能将是 由Python解释器调用(在 特别是模块初始化 函数)必须使用声明 外部“C”。没有必要 将Python头文件括起来 extern“C”{...} - 他们使用这种形式 已经符号__cplusplus了 定义(所有最近的C ++编译器 定义这个符号)。
第一个限制是“无法使用构造函数的全局或静态对象”,这与大多数C ++编译器使用此类存储持续时间初始化对象的方式有关。例如,请考虑以下代码:
class Foo { Foo() { } };
static Foo f;
int main(int argc, char** argv) {}
编译器必须发出特殊代码,以便在执行main之前为'f'调用'Foo'构造函数。如果在Python扩展和中有静态存储持续时间的对象,则不会为C ++编译和链接Python解释器,那么将不会创建此特殊初始化代码。
第二个限制,“Python解释器调用的函数(特别是模块初始化函数)必须使用extern”C“声明,与C ++名称修改有关。大多数C ++编译器都会破坏它们的名称,以便它们可以使用为C工具链提供的相同链接器。比如说你有:
void a_function_python_calls(void* foo);
C ++编译器可能会将名称'a_function_python_calls'的引用转换为'a_function_python_calls @ 1vga'之类的内容。在这种情况下,当您尝试链接Python库时,您可能会得到一个未解析的外部。