【问题标题】:extending 'incomplete' types (SWIG)扩展“不完整”类型(SWIG)
【发布时间】:2012-04-03 14:01:30
【问题描述】:

我正在寻找一种方法来扩展(即使用 %extend 指令向类型添加新成员)在库文件本身中定义的类型,而库的头文件仅提供前向声明输入。

将类型视为其定义在编译时已知,会导致以下警告:

Warning 303: %extend defined for an undeclared class [name of the type].

有人知道这个问题的解决方案或解决方法吗?我确定有一个,因为 SWIG 的文档指出 swig 假定每次找到未知类型时都是结构或联合。

非常感谢!

【问题讨论】:

  • SWIG 是互操作的正则表达式。现在你有两个问题。
  • @HansPassant 我不同意。 SWIG 有点“古怪”,但一旦你了解了它的特性,它就会非常强大,具有有用的封装+抽象。

标签: c++ c interface swig language-binding


【解决方案1】:

您可以非常轻松地向已在 SWIG 中前向声明的类型添加额外的方法,方法是在接口中给它一个空定义,例如

test.h:

// Forward declare foo
struct foo;

test.i:

%module test

// Tell SWIG to wrap foo "properly", but that you don't know anything about it:
struct foo { };

%include "test.h"

%extend foo {
  void bar() {
    // Do stuff, probably with $self, here
  }
}

关键在于,在接口文件中,您实际上并不是在编写通常意义上的 C 或 C++,而是在告诉 SWIG 需要包装哪些类型以及每种类型的哪些部分。

由于您可能会依赖库来创建和销毁您还想添加的实例:

%nodefaultctor foo; 
%nodefaultdtor foo; 

在接口文件中抑制构造函数/析构函数的生成并强制它通过库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 2010-10-02
    • 2019-11-02
    • 2020-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    相关资源
    最近更新 更多