如何让SWIG以不同的方式重命名嵌套结构?

时间:2015-02-12 06:59:26

标签: c swig

说我有一个example.h文件,其中包含以下内容:

struct foo_bar {
  int x;
};

struct foo {
  struct {
    int y;
  } bar;
};

example.i包含以下内容:

%module example
%{
#include "example.h"
%}
%include "example.h"

现在,当我生成SWIG包装器时,SWIG定义了一个新的结构foo_bar来访问bar中的嵌套foo结构(也是mentioned in the documentation)。但是这会导致foo_bar结构重复,并且编译失败。

那么,当SWIG创建自定义结构以访问foo2的嵌套结构时,如何让SWIG使用foo,以便创建foo的所有嵌套结构,如{{1} }}?我尝试foo2_bar但它只重命名包装函数,而不是SWIG创建的自定义结构来访问嵌套结构。

2 个答案:

答案 0 :(得分:1)

您可以使用高级SWIG重命名运算符有选择地仅重命名嵌套类,例如:

%rename("nestedprefix%s", %$isnested) "";

将添加' nestedprefix'在任何嵌套类型的名称前面。

您还可以使用正则表达式和全名匹配将struct foo { struct bar {};};转换为foo_bar

%rename("%(regex:/.*?(::)?([^:]*)(::)?([^:]+)/\\2_\\4/)s", %$isnested, fullname=1) "";

(正则表达式可能需要进行一些调整以匹配我还没有想到的所有奇怪的情况)。

对于您使用匿名内部类显示的特定情况,您可以执行以下操作:

%module test

%rename("%s_inner", %$isnested, match$name="foo_bar") "";

%inline %{
struct foo_bar {};

struct foo {
  struct {
    int x;
  } bar;
};
%}

这只重命名嵌套的类,否则将被称为foo_bar,而不是原来的foo_bar

可替换地:

%rename("%s_inner", %$isnested, %$classname="foo") "";

将内部类与名为foo的父类匹配。

答案 1 :(得分:1)

目前,我在整个C源代码中find使用/\bfoo\b/replace foo2进行{{1}}。