我试图在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在我的代码中的方式定义PyMethodDef并确认其编译没有错误,我确认了这是导致此问题的原因。但是,我不知道该如何纠正。我希望自己不要硬编码并重新定义它。
希望这足够清楚。我可以根据要求提供更多详细信息。
谢谢。

最佳答案

如果您尝试使用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/

10-09 22:45