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

3 投票
1 回答
1599 浏览
提问于 2025-04-16 20:57

我在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更容易访问这个结构。

撰写回答