"%include"和"#include"之间的区别

16

在SWIG中,"%include"指令和标准的C "#include"之间有什么区别?

例如,在所有的教程中,它们通常看起来像这样:

%module my_module

%{
#include "MyHeader.h"
%}

%include "MyHeader.h"

对我来说,这似乎是多余的。也许有知识的人可以澄清一下。

有没有首选的方法来包含C++代码?

2个回答

20
%{ ... %} 中的内容将直接传递到输出中;它本身不会被 SWIG 解释。因此,#include 是为了确保生成的 C/C++ 代码包含该头文件。
相比之下,%include 是 SWIG 指令。它告诉 SWIG 在继续处理之前处理该头文件。这样,SWIG 将了解(并生成包装器)在该头文件中声明的类型和函数。
如果头文件非常复杂,则可能会使 SWIG 混淆或导致非常大的输出(因为 SWIG 尝试为其中的所有内容生成包装器)。在这种情况下,最好手动声明您需要 SWIG 处理的头文件部分,并省略 %include。但是,您仍然可能需要#include以便生成的 C++ 可以编译。
[更新]
至于“首选”,SWIG 更多的关注于能否工作而不是“首选”... 如果您有一个非常干净的头文件,声明了单个类的良好接口,您可以只是%include它,并让 SWIG 自动生成包装器。如果您的头文件非常复杂(例如iostream),则应手动告诉 SWIG 要包装什么。但并没有硬性规定。

2

%include会仅包含一次文件,这意味着您不需要使用 include-guards。默认情况下,除非您使用 -includeall 选项运行 SWIG,否则 #include 将被忽略。

此外,任何在 %{ 和 %} 之间的内容都将被预处理器忽略,并且在不做任何修改的情况下复制到输出中。

更多信息请阅读:http://www.swig.org/Doc1.3/Preprocessor.html


1
哎呀,如果我需要多次%include同一个文件怎么办(因为每次都设置了预处理器宏的不同值)? - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接