3

C/Python API で定義された構造体を C++ クラスで使用しようとしています。PyMethodDef具体的には、 andの構造体の配列を定義しようとしています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 に答える