3

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

对于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并确认它编译没有错误来确认这是问题的原因。但是,我不知道如何纠正这一点。我不想自己硬编码和重新定义它。希望这足够清楚。我可以根据要求提供更多细节。谢谢。

4

1 回答 1

7

如果您尝试使用 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"
于 2012-08-20T20:42:11.467 回答