为什么 Swig 接口文件中存在这种冗余?

Why this redundancy in Swig interface file?

我看到 here swig 接口文件在 2 个地方(在 %{ }% 部分中和之后)有相同的声明。

/* 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();

为什么需要这种冗余?

%{%} 之间的代码直接注入到生成的 SWIG 包装器代码中,以使声明对编译器可用。例如,您可以在这个块中有一个实用函数,它只对编译器可见但不暴露给目标语言,或者添加编译包装器所需的 #include 语句。

该块之外的代码由 SWIG 解析并暴露给目标语言。如果您遗漏了本节中的其中一项声明,它就不会暴露给目标语言。

在这种情况下,您可以通过使用 %inline 来消除冗余,它既将代码注入包装器又对其进行解析以暴露给目标语言:

%module example

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