Python Cython:在结构中嵌套联合

Python 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

在Cython glue声明中,如何表示包含匿名联合的C
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这个问题是关于匿名结构或联合的;您的结构是命名的,因此不是匿名的,因此您必须为嵌套结构创建一个特殊的结构定义。我尝试了在类似上下文中提到的两个选项,但都失败了。你有不同的建议吗?