在Cython glue声明中,如何表示包含匿名联合的C struct
类型?例如,如果我有一个包含
mystruct.h
struct mystruct
{
union {
double da;
uint64_t ia;
};
};
然后,在相应的.pyd
文件中
cdef extern from "mystruct.h":
struct mystruct:
# what goes here???
我试过了:
cdef extern from "mystruct.h":
struct mystruct:
union {double da; uint64_t ia;};
但这只在union
行上给了我“C变量声明中的语法错误”。
答案 0 :(得分:8)
对于那些通过谷歌来到这里的人,我找到了解决方案。如果你有一个结构:
typedef struct {
union {
int a;
struct {
int b;
int c;
};
}
} outer;
您可以在Cython声明中将其全部展平,如下所示:
ctypedef struct outer:
int a
int b
int c
Cython并没有生成任何代码来对结构的内存布局做出任何假设;你只是通过告诉它生成什么语法来调用它来告诉它你所调用的事实结构。因此,如果您的结构具有可以作为int
访问的大小为((outer) x).a
的成员,那么您可以在结构定义上抛出a
,它将起作用。它是在文本替换而不是内存布局上运行的,所以它并不关心这些东西是匿名的联合或结构还是你有什么。
答案 1 :(得分:7)
您无法根据我的知识嵌套声明,并且Cython不支持匿名工会AFAIK。
尝试以下方法:
cdef union mystruct_union:
double lower_d
uint64_t lower
cdef struct mystruct:
mystruct_union un
现在以un.lower_d
和un.lower
访问联盟成员。