如果我有这两个C ++文件:
Foo.cpp中:
#include "foo.h"
void foo(Foo* p) {};
foo.h中:
class Foo {};
void foo(Foo*);
我可以写这个SWIG界面
%{
#include "foo.h"
%}
%include <cpointer.i>
%pointer_class(Foo, Foop)
%include "foo.h"
编译,然后调用
>>>p = Foop()
>>>foo(p)
如果Foo
是typedef而不是
typedef int Foo;
这样我可以像上面那样进行相同的Python调用吗?
答案 0 :(得分:1)
我认为%pointer_class
不适用于typedef
。 SWIG认为typedef
与原始类型相同,并且不为typedef-ed名称生成包装器。例如,SWIG仅为Python生成Bar
:
%module x
%inline %{
class Bar {};
typedef Bar Foo;
void foo(Foo* p) {};
%}
输出:
>>> import x
>>> x.Foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'Foo'
>>> p=x.Bar()
>>> x.foo(p)
>>>
因此,我认为typedef int Foo;
和%pointer_class(Foo, Foop)
的情况不起作用,因为Foo
包装器不存在。我发现以下“技巧”适用于class
和int
,如果您在两种情况下都使用typedef
并对%pointer_class
的两个参数使用相同的值:
%module x
%inline %{
class Bar {};
typedef Bar Foo;
void foo(Foo* p) {};
%}
%include <cpointer.i>
%pointer_class(Foo, Foo) // doesn't work if 2nd param doesn't match 1st.
和
%module x
%inline %{
typedef int Foo;
void foo(Foo* p) {};
%}
%include <cpointer.i>
%pointer_class(Foo, Foo) // doesn't work if 2nd param doesn't match 1st.
但是如果你真的想要一个opaque类型,不要让SWIG只通过声明类并隐藏定义来看到定义:
%module x
%inline %{
class Foo;
void foo(Foo* p);
%}
%include <cpointer.i>
%pointer_class(Foo, Foop)