C++のstrcutはclassの特殊な定義なのでcdef structではなく、cdef cppclassを使った方が良い。clangだと継承とか何もしてないstructを読むときにcdef structを使うと動かない(2015年8月現在)。
cythonのドキュメントにどこにも書いてなくて、継承したstructを読み込む場合なんかも分からなくて困る。
参考
cdef structしちゃう場合
hoge.h
typedef struct {
int moke;
double fuga;
} HogeStruct;
hoge.pxd
cdef extern from "hoge.h" nogil:
cdef struct HogeStruct:
int fuga
double piyo
hoge.pyx
def foo():
cdef HogeStruct bar
コレでやると、pyx内のstruct HogeStruct barで、elaborated type refers to a typedef
が出てしまう。struct HogeStruct __pyx_v_bar;
というのが生成されるのでstructそのものの定義文と衝突する。
cppclassを使う
特に単純にstructじゃなくてcppclassを使えば良い
hoge.h
typedef struct {
int moke;
double fuga;
} HogeStruct;
hoge.pxd
cdef extern from "hoge.h" nogil:
cdef cppclass HogeStruct:
int fuga
double piyo
hoge.pyx
def foo():
cdef HogeStruct bar
それだけ。