我无法弄清楚如何使SWIG具有由我包装的库管理的不透明数据类型的自定义析构函数。
struct Foo;
Foo* NewFoo();
void UpdateFoo(Foo*);
void DestroyFoo(Foo*);
我尝试使用以下方法将其包装在SWIG中:
%module lib
%{
#include "lib.h"
%}
%extend Foo {
~Foo() {
DestroyFoo(self);
}
}
%include "lib.h"
但是SWIG警告Warning 303: %extend defined for an undeclared class Foo.
,并且未能在生成的包装器C代码中为Foo生成析构函数。
如果给SWIG一个不透明结构的伪定义,则它将不再将该类视为未声明的类。这可以通过在接口文件中添加struct Foo{};
来实现。
完成此操作,还必须通过添加%nodefaultctor Foo
来抑制默认构造函数的生成。
最后,现在返回的Foo指针的生存期由析构函数管理,明智的是使用%ignore DestroyFoo
隐藏destroy函数,以免意外调用它并导致重复删除。
%module lib
%{
#include "lib.h"
%}
%nodefaultctor Foo;
%extend Foo {
~Foo() {
DestroyFoo(self);
}
}
%ignore DestroyFoo
%include "lib.h"
// Get SWIG to treat Foo as a declared class.
struct Foo{};