我试图让SWIG识别一个简单的预处理器宏,它可以根据另一个定义和更复杂的函数“定义”一个新函数。所以,在C头文件,我有:SWIG中的预处理器宏
#define FOO 1
#define my_macro_fun(args) my_fun(args,FOO)
痛饮看到并成功包装my_fun
,但我想它来包装my_macro_fun
代替。
我试图让SWIG识别一个简单的预处理器宏,它可以根据另一个定义和更复杂的函数“定义”一个新函数。所以,在C头文件,我有:SWIG中的预处理器宏
#define FOO 1
#define my_macro_fun(args) my_fun(args,FOO)
痛饮看到并成功包装my_fun
,但我想它来包装my_macro_fun
代替。
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"
这个小谎言是完全没有在痛饮 - 它会产生假设my_macro_fun(int)
是调用包装代码,就像你会如果你使用宏。在编译包装器时,编译器最终会使用宏,没有人比较聪明。
请注意,顺序非常重要 - 宏的功能需要在接口文件中的%include
之前,否则SWIG将在解析声明时尝试扩展宏,从而导致语法错误。您可以完全跳过%include
,也可以使用%ignore
,如果您想将其包含在其他零件中,但在生成的接口中抑制原始my_fun
。
随着夜风一些语言(例如Python的),你也可以use the typemap default:
%module test
%{
#include "test.h"
%}
%typemap(default) int b {
$1 = FOO;
}
%include "test.h"
要如果没有,给出了它的参数提供一个值。