回心誌

日々是回心

【cython】pxdでstruct宣言するときに Variable type 'hoge' is incompleteってでた時どうするか。

structの宣言でハマった。

こういうstructを作りたい時。

#filename: test1.pyx
cdef struct XY:
    int x,y
def method():
  ......
#filename: test1.pxd
ctypedef struct XY

こんな感じに書いてた。

そうすると、実際にcimportして構造体を使うときに怒られる。

#filename test2.pyx
from test1 cimport XY
def functest():
    cdef XY xy

こんな感じに↓

cythonize test2.pyx
...
中略
...
test2.pyx:4:12: Variable type 'XY' is incomplete


pyx, pxdをこう書き換える必要がある。pyxからpxdに、構造体の宣言を書き写せばいい。

#filename: test1.pyx
def method():
  ......
#filename: test1.pxd
ctypedef struct XY:
    int x,y


ちなみにO'REILLYのCython本には

simulator.pxdに含まれている宣言を、実装ファイルにも書くことはできない。書くと、コンパイルエラーが発生する。

とあり、pxdとpyxに同じ宣言を書けないような記述があるが、実際にやってみてもコンパイルエラーにはならなかった。structは別とか、矛盾がなければスルーするとか、そういう感じなのかな。

こういうことで一々ハマるし、ググっても答えにたどり着けないので大変だ。