CPython API与C++类一起摇摆

CPython API jiving with C++ class

本文关键字:一起摇摆 C++ API CPython      更新时间:2023-10-16

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

对于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;

而CCD_ 8被定义为:

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

我以PyMethodDef在代码中的方式定义了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中。

然后快速浏览一下关于定义新类型的Python文档,您会注意到该示例以开头

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