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

3

我在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 绑定。实际上 swig 不支持像这样的嵌套联合体,但是使用变量声明就可以解决:

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

这个解决方案对我来说并不适用,因为它会破坏使用这个结构的大量C代码(你改变了访问联合成员的方式)。
我想到两种可能性:
  1. 添加value变量声明,这样swig问题就解决了,但我需要一种在C中直接访问联合成员的方法(以避免破坏大量函数)。你知道一种或多种吗?
  2. 在swig中找到其他方法。你知道一种或多种吗?
欢迎任何其他解决方案!
1个回答

1
我的建议是为C代码和SWIG提供两个不同的头文件。 请尝试这段代码:
union {
    struct print_arg_atom       atom;
    struct print_arg_field      field;
    ...
} /*SWIG_VALUE*/;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接