gpt4 book ai didi

c++ - python C API 是否与 C++ 完全兼容?

转载 作者:行者123 更新时间:2023-11-30 01:26:28 25 4
gpt4 key购买 nike

据我理解C和C++的关系,后者本质上是前者的扩展,并保留了一定程度的向后兼容性。假设可以使用 C++ 代码调用 python C API 是否安全?

更重要的是,我注意到官方 python 文档在同一页面上将 C 和 C++ 扩展捆绑在一起。我在任何地方都找不到 C++ API。这让我相信,在两种语言中使用相同的 API 是安全的。

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

编辑:

我想我的问题比需要的复杂得多。问题是:我必须做什么才能用 C++ 编写 python 模块?我是否只按照列出的相同说明进行操作 here , 用 C 代码代替 C++?是否有单独的 API?

最佳答案

我可以确认在 C 和 C++ 两种语言中使用相同的 Python C API 是安全的。但是,很难为您提供更详细的答案,除非您提出更具体的问题。您应该注意许多注意事项和问题。例如,您的 Python 扩展被定义为 C 类型结构,而不是 C++,因此不要期望它们的构造函数/析构函数被隐式定义和调用

例如,从Defining New Types中获取示例代码在 Python 手册中,它可以用 C++ 方式编写,你甚至可以混合 C++ 类型:

// 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 的构造函数和析构函数都不会被调用。因此,请记住为您的 noddy_NoddyType 定义 dealloc 函数,您将在其中使用 nullptr 重置 value。您可能会问,为什么还要费心将值定义为 shared_ptr。如果你在 C++ 中使用你的 Python 扩展,这很有用,除了异常(exception),以避免类型转换和强制转换,在你的实现定义中有更多的无缝集成,基于异常的错误处理可能会更容易,等等。尽管 noddy_NoddyType 的对象是由纯 C 实现的机器管理的,但由于 dealloc 函数,value 将是根据众所周知的 RAII 规则发布。

在这里您可以找到 Python C API 与 C++ 语言几乎无缝集成的有趣示例:How To catch Python stdout in c++ code

关于c++ - python C API 是否与 C++ 完全兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10368141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com