我正在尝试使用C ++类中C / Python API中定义的结构。具体地讲,我试图限定结构的阵列,用于PyMethodDef与PyMemberDef(文档这里):
对于PyMethodDef,我能够在类头中定义静态数组,并在实现文件中声明它。但是,对它做同样的事情PyMemberDef会给我以下错误:
error: elements of array 'PyMemberDef members_ []' have incomplete type
error: storage size of 'members_' isn't known.
Run Code Online (Sandbox Code Playgroud)
我想我可以理解为什么PyMethodDef有效,但是PyMemberDef无效。在Python源代码中,PyMethodDef其定义如下:
struct PyMethodDef {
...
...
};
typedef struct PyMethodDef PyMethodDef;
Run Code Online (Sandbox Code Playgroud)
而PyMemberDef定义如下:
typedef struct PyMemberDef {
...
...
} PyMemberDef;
Run Code Online (Sandbox Code Playgroud)
通过定义代码中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.
Run Code Online (Sandbox Code Playgroud)
因此,似乎PyMemberDef这里并未实际声明。
快速grep显示它已在中声明structmember.h,而该文件未包含在中Python.h。
然后快速浏览有关定义新类型的Python文档,您可能会注意到示例以以下内容开头:
#include <Python.h>
#include "structmember.h"
Run Code Online (Sandbox Code Playgroud)