如何将SWIG%pointer_class与typedef类型一起使用?

时间:2013-11-18 02:41:56

标签: swig

如果我有这两个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调用吗?

1 个答案:

答案 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包装器不存在。我发现以下“技巧”适用于classint,如果您在两种情况下都使用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)