首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python与C++完全兼容吗?

python与C++完全兼容吗?
EN

Stack Overflow用户
提问于 2012-04-28 22:31:40
回答 2查看 1K关注 0票数 1

正如我所理解的,C和C++之间的关系,后者本质上是前者的扩展,并保持了一定程度的向后兼容性。假设用C++代码调用python是安全的吗?

更重要的是,我注意到正式的python文档将C和C++扩展捆绑在同一个页面上。我找不到一个C++ API。这使我相信在两种语言中使用相同的API是安全的。

有人能证实或否认这一点吗?

编辑:

我想我的问题比需要的要复杂得多。问题是:要用C++编写python模块,我必须做些什么?我是否只是遵循与列出的这里相同的指示,以C代码代替C++?有单独的API吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-28 22:50:07

我可以确认相同的Python在C和C++两种语言中都是安全的。然而,除非你会提出更具体的问题,否则很难给你提供更详细的答案。有很多的警告和问题,你应该知道。例如,您的Python扩展被定义为C类型结构,而不是C++,因此不要期望它们的构造函数/析构函数被隐式定义,而被称为

例如,从Python手册中的定义新类型获取示例代码,它可以用C++方式编写,甚至可以混合到C++类型中:

代码语言:javascript
运行
复制
// noddy.cpp
namespace {

struct noddy_NoddyObject
{
    PyObject_HEAD
    // Type-specific fields go here.
    std::shared_ptr<int> value; // WARNING
};

PyObject* Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
    try {
        Noddy *self = (Noddy *)type->tp_alloc(type, 0);
        if (self) {
            self->value = std::make_shared(7);
            // or more complex operations that may throw
            // or extract complex initialisation as Noddy_init function
            return self;
        }
    }
    catch (...) {
        // do something, log, etc.
    }
    return 0;
}

PyTypeObject noddy_NoddyType =
{
    PyObject_HEAD_INIT(NULL)
    // ...
}

} // unnamed namespace

但是,std::shared_ptr的构造函数和析构函数都不会被调用。因此,请记住为您的dealloc定义noddy_NoddyType函数,其中您将用nullptr重置value。您可能会问,为什么还要麻烦地将值定义为shared_ptr。如果您在C++中使用Python扩展(除了例外),以避免类型转换和转换,为了在实现定义中实现更无缝的集成,基于异常的错误处理可能会更容易,等等。尽管您的noddy_NoddyType对象是由纯C实现的机器管理的,但是由于dealloc函数的存在,value将根据众所周知的RAII规则发布。

在这里,您可以找到关于Python与C++语言几乎无缝集成的有趣示例:如何在c++代码中捕获

票数 4
EN

Stack Overflow用户

发布于 2012-04-28 22:41:57

Python可以在C++代码中调用。Python扩展是使用C扩展使用的相同的C++ API编写的,或者是使用一些第三方API编写的,比如boost::python

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10368141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档