1

特定の状況下で 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
4

1 に答える 1