13

在 Cython 胶水声明中,如何表示struct包含匿名联合的 C 类型?例如,如果我有一个 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;};

但这只给了我“C变量声明中的语法错误”就union行了。

4

2 回答 2

14

对于那些通过谷歌来到这里的人,我找到了解决方案。如果你有一个结构:

typedef struct {
    union {
        int a;
        struct {
            int b;
            int c;
        };
    }
} outer;

您可以在 Cython 声明中将其全部展平,如下所示:

ctypedef struct outer:
    int a
    int b
    int c

Cython 不会生成任何对结构的内存布局做出任何假设的代码。你只是通过告诉它生成什么语法来调用它来告诉它你所调用的事实上的结构。因此,如果您的结构有一个 sizeint可以作为 访问的成员((outer) x).a,那么您可以抛出a结构定义并且它将起作用。它在文本替换上运行,而不是内存布局,所以它不关心这些东西是在匿名联合还是在结构中,或者你有什么。

于 2015-01-15T01:12:29.727 回答
9

据我所知,您不能嵌套声明,而且 Cython 不支持匿名联合 AFAIK。

尝试以下操作:

cdef union mystruct_union:
    double lower_d
    uint64_t lower

cdef struct mystruct:
    mystruct_union un

un.lower_d现在以和访问联合成员un.lower

于 2012-09-17T01:54:36.680 回答