SWIG 中的预处理器宏

joh*_*ter 5 c python swig

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

#define FOO 1
#define my_macro_fun(args) my_fun(args,FOO)
Run Code Online (Sandbox Code Playgroud)

SWIG 看到并成功换行my_fun,但我希望它换行my_macro_fun

Fle*_*exo 5

SWIG 尝试发现常量宏并包装它们,但它无法对这样的宏执行任何智能操作。幸运的是,有一个简单的解决方法。假设您有以下头文件:

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

void my_fun(int a, int b);
Run Code Online (Sandbox Code Playgroud)

你可以像这样包装它:

%module test
%{
#include "test.h"
%}

%include "test.h"
Run Code Online (Sandbox Code Playgroud)

它会跳过该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"
Run Code Online (Sandbox Code Playgroud)

这个小谎言在 SWIG 中完全没问题 - 它会生成假设my_macro_fun(int)可调用的包装器代码,就像使用宏时一样。当编译包装器时,编译器最终将在那里使用宏,而没有人知道。

请注意,顺序很重要 - 实际上是宏的函数需要位于%include接口文件中的之前,否则 SWIG 将在解析声明期间尝试扩展宏,从而导致语法错误。您可以完全跳过%include,或者如果您想将其包含在其他部分但在生成的界面中%ignore隐藏原始内容,也可以使用 a 。my_fun


对于某些 SWIG 语言(例如 Python),您还可以使用类型映射默认值

%module test
%{
#include "test.h"
%}

%typemap(default) int b {
  $1 = FOO;
}

%include "test.h"
Run Code Online (Sandbox Code Playgroud)

如果没有给出参数,则为参数提供一个值。