说我有一个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创建的自定义结构来访问嵌套结构。
答案 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}}。