我正在尝试让SWIG识别一个简单的预处理器宏,它根据另一个定义和更复杂的函数“定义”一个新函数。所以,在C头文件中我有:
#define FOO 1
#define my_macro_fun(args) my_fun(args,FOO)
SWIG看到并成功包装my_fun
,但我希望它包裹my_macro_fun
。
答案 0 :(得分:4)
SWIG尝试发现macros that are constants并将它们包装起来,但它无法像这样使用宏做任何聪明的事情。幸运的是,这是一个简单的工作。想象一下,您有以下头文件:
#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"
这个小谎言在SWIG中完全没问题 - 它会生成Wrapper代码,假定my_macro_fun(int)
可以调用,就像你使用宏一样。在编译包装器时,编译器最终会在那里使用宏而没有人更聪明。
请注意,顺序很重要 - 实际上宏需要在接口文件中%include
之前的函数,否则SWIG将在解析声明期间尝试扩展宏,这会导致语法错误。您可以完全跳过%include
,也可以使用%ignore
,如果您想将其包含在其他部分中,但在生成的界面中禁止原始my_fun
。
使用一些SWIG语言(例如Python),您还可以use the typemap default:
%module test
%{
#include "test.h"
%}
%typemap(default) int b {
$1 = FOO;
}
%include "test.h"
如果没有为参数提供参数,则为其提供值。