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

0

如果您希望 SWIG 将语句直接传递到生成的文件中,然后将它们放入 %{ .. %}

是的,它也用于将#include传递到 swig 生成的输出中。

于 2013-05-03T20:01:31.057 回答