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

Difference between "%include" and "#include"

本文关键字:区别 %include #include      更新时间:2023-10-16

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

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

%module my_module
%{
#include "MyHeader.h"
%}
%include "MyHeader.h"

这在我看来是多余的。也许有知识的人可以澄清。

是否有包含C++代码的首选方法?

%{ ... %}中的内容直接传递到输出;SWIG不对其本身进行解释。因此,#include在那里确保生成的C/C++代码包括该标头。

相比之下,%include是SWIG指令。它告诉SWIG在继续之前处理该头文件。通过这种方式,SWIG将了解(并为其生成包装器)头文件中声明的类型和函数。

如果标头非常复杂,它可能会混淆SWIG或导致非常大的输出(因为SWIG试图为其中的所有内容生成包装器)。在这种情况下,最好只手动声明需要SWIG处理的标头部分,并省略%include。但是您可能仍然需要#include以便编译生成的C++。

[更新]

至于"首选",SWIG更多的是关于什么有效,而不是什么是"首选"。。。如果您有一个非常干净的头文件,为单个类声明了一个漂亮的接口,那么您只需%include它,并让SWIG自动生成包装器。如果您的头文件非常粗糙(例如iostream),您应该手动告诉SWIG要包装什么。但没有硬性规定。

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

此外,预处理器将忽略%{和%}之间的任何内容,并在不对输出进行任何修改的情况下进行复制。

您可以阅读以下内容:http://www.swig.org/Doc1.3/Preprocessor.html.