Python Cython:在结构中嵌套联合
在Cython glue声明中,如何表示包含匿名联合的CPython Cython:在结构中嵌套联合,python,c,struct,cython,unions,Python,C,Struct,Cython,Unions,在Cython glue声明中,如何表示包含匿名联合的Cstruct类型?例如,如果我有一个C头文件mystruct.h包含 struct mystruct { union { double da; uint64_t ia; }; }; 然后,在相应的.pyd文件中 cdef extern from "mystruct.h": struct mystruct: # what goes here??? 我试过这个: cde
struct
类型?例如,如果我有一个C头文件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变量声明中的语法错误”。据我所知,不能嵌套声明,Cython不支持匿名联合
请尝试以下操作:
cdef union mystruct_union:
double lower_d
uint64_t lower
cdef struct mystruct:
mystruct_union un
现在以
un.lower\u d
和un.lower
的身份访问工会成员。对于那些通过谷歌来到这里的人,我找到了一个解决方案。如果您有一个结构:
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
,它将起作用。它是在文本替换上操作的,而不是内存布局,所以它不关心这些东西是在匿名联合还是在结构中,或者你有什么东西。我不明白为什么这个问题被解决了。它似乎对其他Cython用户相当有帮助,它有一个很好的标题和标签,最后是一个公认的答案。它是如何“过于本地化”的?是的,这个问题的表达让它听起来非常专业化,但实际上这是一个一般性的问题,任何试图将复杂的C库粘合到Python扩展中的人都可能会遇到这个问题。我已经试图让大家更清楚地知道,问题中的代码只是一个通用场景的示例。在我的代码中尝试类似的东西会导致编译错误,说outer没有名为“b”的成员。@Noich:你的Cython和C代码中有pastebin或其他东西吗?我可以看一下。C代码在这里尝试命名结构:尝试展平:谢谢@Noich这个问题是关于匿名结构或联合的;您的结构是命名的,因此不是匿名的,因此您必须为嵌套结构创建一个特殊的结构定义。我尝试了在类似上下文中提到的两个选项,但都失败了。你有不同的建议吗?