SWIG中用于不透明结构的自定义析构函数

问题描述 投票:0回答:1

我无法弄清楚如何使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
1个回答
2
投票

如果给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{};
© www.soinside.com 2019 - 2024. All rights reserved.