特定の状況下で SWIG 出力に複数回含まれないように、定義にガードを付ける必要がある場合があります。残念ながら、SWIG は .cc ファイルを書き込む前に #if ステートメントを展開しています。状況は次のとおりです。
%define FOO(BAR)
%{
#if !defined(_##BAR##_DECLARED)
#define _##BAR##_DECLARED
// declaration stuff
#endif
%}
// implementation stuff
%enddef
SWIG は次のように生成FOO(CLS)
します。
#if !0
#define _CLS_DECLARED
/*@SWIG:dummy.swg,46,FOO@*/
// declaration stuff
/*@SWIG@*/;
#endif
// implementation stuff
したがって、#if
ステートメントは出力を書き込む前に SWIG によって展開されますが (役に立たない#if !0
が作成されます) #define
、. SWIGに展開しないように指示する方法はあり#if
ますか?
GUARD(SYM)
さまざまな方法で定義した補助マクロを追加してみました:
// Using C-style macros, including !defined()
#define GUARD(SYM) !defined(_##SYM##DECLARED)
// Using C-style macros, excluding !defined()
#define GUARD(SYM) _##SYM##DECLARED)
// Using SWIG-style macros, including !defined()
%define GUARD(SYM) !defined(_##SYM##DECLARED)
%enddef
// Using SWIG-style macros, excluding !defined()
%define GUARD(SYM) _##SYM##DECLARED
%enddef
これらのそれぞれについて、#if
それに応じてステートメントを変更しました。出力は常に同じです。
役に立つ場合は、次の出力を示しswig -version
ます。
SWIG Version 2.0.8
Compiled with g++ [i386-apple-darwin11.4.2]
Configured options: +pcre
Please see http://www.swig.org for reporting bugs and further information