如何使用SWIG访问嵌套的union成员?

时间:2011-07-06 14:06:52

标签: python c swig unions

我在C中有这样的结构:

struct print_arg {
    struct print_arg        *next;
    enum print_arg_type     type;
    union {
        struct print_arg_atom       atom;
        struct print_arg_field      field;
        struct print_arg_typecast   typecast;
        struct print_arg_flags      flags;
        struct print_arg_symbol     symbol;
        struct print_arg_func       func;
        struct print_arg_string     string;
        struct print_arg_op     op;
        struct print_arg_dynarray   dynarray;
    };
};

我正在使用swig导出python绑定。实际上swing不支持这样的嵌套联合,但是使用变量声明就可以了:

union {
    struct print_arg_atom       atom;
    struct print_arg_field      field;
    ...
} value;

这个解决方案实际上并不适合我,因为它使用这个结构打破了很多C代码(你改变了访问union成员的方式)。

我想到两种可能性:

  1. 添加value变量声明,因此解决了swig问题,但我需要一种直接在C中访问union成员的方法(不破坏许多函数)。你知道一个或多个吗?

  2. 在swig中找到另一种方式。你知道一个或多个吗?

  3. 欢迎任何其他解决方案!

1 个答案:

答案 0 :(得分:0)

我的建议是为C代码和SWIG提供两个不同的头文件。试试这段代码:

union {
    struct print_arg_atom       atom;
    struct print_arg_field      field;
    ...
} /*SWIG_VALUE*/;

运行SWIG创建JNI代码时,请将/*SWIG_VALUE*/替换为value。这不应该改变字段的地址,但它将使SWIG更容易访问该结构。