2

ライブラリ ファイル自体で定義されている型を拡張する (つまり、%extend ディレクティブを使用して型に新しいメンバーを追加する) 方法を探していますが、ライブラリのヘッダー ファイルは型の前方宣言のみを提供します。

コンパイル時にその定義が既知であるかのように型を扱うと、次の警告が表示されます。

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

この問題の解決策または回避策を知っている人はいますか? SWIG のドキュメントには、swig が不明な型を見つけるたびに構造体または共用体であると想定していると記載されているため、1 つあると確信しています。

よろしくお願いします!

4

1 に答える 1

5

インターフェイスで空の定義を与えることにより、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; 

インターフェイス ファイルで、コンストラクター/デストラクターの生成を抑制し、強制的にライブラリを通過させます。

于 2012-04-04T09:29:29.493 に答える