c++ - CPython API 与 C++ 类相结合

标签 c++ python api

我正在尝试在 C++ 类中使用 C/Python API 中定义的结构。具体来说,我正在尝试为 PyMethodDefPyMemberDef 定义一个结构数组(文档为 here ):

对于 PyMethodDef,我可以在类头中定义静态数组并在实现文件中声明它。但是,对 PyMemberDef 做同样的事情会给我以下错误:

error: elements of array 'PyMemberDef members_ []' have incomplete type
error: storage size of 'members_' isn't known.

我想我明白了为什么 PyMethodDef 有效但 PyMemberDef 无效。在 Python 源代码中,PyMethodDef 定义如下:

struct PyMethodDef {
    ...
    ...
};

typedef struct PyMethodDef PyMethodDef;

PyMemberDef 是这样定义的:

typedef struct PyMemberDef {
   ...
   ...
} PyMemberDef;

我通过在我的代码中定义 PyMemberDef 的方式确认这是问题的原因,并确认它编译没有错误。但是,我不知道如何纠正这个问题。我不想自己硬编码和重新定义它。 希望这已经足够清楚了。我可以根据要求提供更多详细信息。 谢谢。

最佳答案

如果您尝试使用 clang,它会给您一些更有意义的错误消息,例如:

pymountboot.cxx:45:20: error: variable has incomplete type 'PyMemberDef'
static PyMemberDef foo_members[] = {
                   ^
/usr/include/python2.7/object.h:381:12: note: forward declaration of 'PyMemberDef'
    struct PyMemberDef *tp_members;
           ^
1 error generated.

因此,似乎 PyMemberDef 实际上并未在这里声明。

快速 grep 显示它在 structmember.h 中声明,并且该文件不包含在 Python.h 中。

然后快速浏览 Defining new types 上的 Python 文档您可能会注意到该示例以:

#include <Python.h>
#include "structmember.h"

关于c++ - CPython API 与 C++ 类相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12044036/

相关文章:

python.el shell 和执行缓冲区

json - 从输出中隐藏time_out,_shards,max_score和其他默认字段

json - 如何访问嵌套在 Oxford Dictionaries API 的多层数组和字典中的定义键?

python - 定义一个 xml 来表示图的邻接列表?

php - 允许在 SOAP API 响应(PHP)中下载 PDF 文件(作为附件)

c++ - Windows C++ 如何安装 GLFW 库?

c++ - 如何 Hook AllocMem()、FreeMem() 等...调用?它可以是任何类型的技术 dll、可执行文件等

c++ - **字符串': ambiguous symbol**

c++ - 如何将 herader 从二进制数据中分离出来

c# - 在 C# 中实现方法装饰器