別の定義とより複雑な関数に基づいて新しい関数を「定義」する単純なプリプロセッサ マクロを SWIG に認識させようとしています。したがって、Cヘッダーファイルには次のものがあります。
#define FOO 1
#define my_macro_fun(args) my_fun(args,FOO)
SWIG は を認識して正常にラップしますが、代わりmy_fun
にラップしたいのです。my_macro_fun
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"
引数が指定されていない場合に、引数に値を指定します。