5

別の定義とより複雑な関数に基づいて新しい関数を「定義」する単純なプリプロセッサ マクロを SWIG に認識させようとしています。したがって、Cヘッダーファイルには次のものがあります。

#define FOO 1
#define my_macro_fun(args) my_fun(args,FOO)

SWIG は を認識して正常にラップしますが、代わりmy_funにラップしたいのです。my_macro_fun

4

1 に答える 1

5

SWIGは定数であるマクロを見つけてラップしようとしますが、そのようなマクロではスマートなことは何もできません。幸い、簡単な回避策があります。次のヘッダーファイルがあるとします。

#define FOO 1
#define my_macro_fun(args) my_fun(args,FOO)

void my_fun(int a, int b);

あなたはそれを次のように包むことができます:

%module test
%{
#include "test.h"
%}

%include "test.h"

関数をスキップしmy_macro_funます。SWIGにそれをラップさせるには、次のことを行う必要があります。

%module test
%{
#include "test.h"
%}

// Lie! Tell SWIG that it should be wrapped like any other function.
void my_macro_fun(int);

// This is entirely optional: it will cause my_fun to be wrapped as well
%include "test.h"

my_macro_fun(int)SWIGでは、この小さな嘘はまったく問題ありません。マクロを使用している場合とまったく同じように、呼び出し可能であると想定するラッパーコードが生成されます。ラッパーをコンパイルするとき、コンパイラーはそこでマクロを使用することになり、誰も賢くなりません。

順序が重要であることに注意してください。実際にはマクロである関数は%include、インターフェイスファイルの前に配置する必要があります。そうしないと、SWIGは宣言の解析中にマクロを展開しようとし、構文エラーが発生します。%include完全にスキップする%ignoreか、他の部分に含めたいがmy_fun、生成されたインターフェイスで元のインターフェイスを抑制したい場合は、を使用することもできます。


一部のSWIG言語(Pythonなど)では、タイプマップのデフォルトを使用することもできます。

%module test
%{
#include "test.h"
%}

%typemap(default) int b {
  $1 = FOO;
}

%include "test.h"

引数が指定されていない場合に、引数に値を指定します。

于 2012-07-10T07:38:04.460 に答える