Swig - 为什么我们需要两次声明函数?

时间:2015-08-25 15:41:04

标签: java c swig

我想使用swig来从Java调用C函数。 我读: SWIG Tutorial

Web包含接口文件示例:

/* example.i */
 %module example
 %{
 /* Put header files here or function declarations like below */
 extern double My_variable;
 extern int fact(int n);
 extern int my_mod(int x, int y);
 extern char *get_time();
 %}

 extern double My_variable;
 extern int fact(int n);
 extern int my_mod(int x, int y);
 extern char *get_time();

为什么函数声明中存在重复? (例如“extern int fact(int n);”在{%%}和文件底部声明?

1 个答案:

答案 0 :(得分:2)

%{%}块中的内容被精确复制到生成的c文件(example_wrap.c)中以用作前向原型。块外的东西用于生成生成的.c文件中的函数。

一个更好的例子假设你已经有一个类似于example.h的头文件:

extern void functionIwantToCallFromJava(int);
extern crazyType *functionIDoNotCareAbout(anotherCrazyType *);

所以在example.i中你有

%{ 
#include "example.h"
%}
extern void functionIwantToCallFromJava(int);

现在生成的文件将包含#include" example.h"接近开头所需的功能,以便functionIwantToCallFromJava正确原型化, 但SWIG并不需要生成大量代码来实现functionIDoNotCareAbout,即使它是在同一个头文件中定义的。