“%include”和“#include”之间的区别

时间:2011-06-08 21:00:52

标签: c++ c swig

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

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

%module my_module

%{
#include "MyHeader.h"
%}

%include "MyHeader.h"

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

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

2 个答案:

答案 0 :(得分:18)

%{ ... %}中的内容直接传递给输出;它本身不是由SWIG解释的。因此,#include用于确保生成的C / C ++代码包含该标题。

相比之下,

%include是一个SWIG指令。它告诉SWIG在继续之前处理该头文件。这样,SWIG将了解(并生成包装)该头文件中声明的类型和函数。

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

[更新]

对于“首选”,SWIG更多的是关于什么比“首选”更有效......如果你有一个非常干净的头文件,为一个类声明一个漂亮的界面,你可以只%include它并让SWIG自动生成包装器。如果你的头文件很毛茸茸(例如iostream),你应该手动告诉SWIG要包装的内容。但是没有严格的规则。

答案 1 :(得分:2)

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

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

更多你可以阅读:http://www.swig.org/Doc1.3/Preprocessor.html