我有一个案例,我需要对定义进行保护,以便在某些情况下它不会多次包含在 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