SWIG中的预处理器宏

时间:2012-07-09 21:32:45

标签: python c swig

我正在尝试让SWIG识别一个简单的预处理器宏,它根据另一个定义和更复杂的函数“定义”一个新函数。所以,在C头文件中我有:

#define FOO 1
#define my_macro_fun(args) my_fun(args,FOO)

SWIG看到并成功包装my_fun,但我希望它包裹my_macro_fun

1 个答案:

答案 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"

如果没有为参数提供参数,则为其提供值。