“%include”和“#include”之间的区别
Posted
技术标签:
【中文标题】“%include”和“#include”之间的区别【英文标题】:Difference between "%include" and "#include" 【发布时间】:2011-06-08 21:00:52 【问题描述】:在 SWIG 中,“%include”指令和标准 C“#include”有什么区别?
例如,在所有教程中,为什么它们通常看起来像这样:
%module my_module
%
#include "MyHeader.h"
%
%include "MyHeader.h"
这对我来说似乎是多余的。也许有知识的人可以澄清一下。
是否有包含 C++ 代码的首选方法?
【问题讨论】:
【参考方案1】:% ... %
中的东西直接传到输出;它本身并不由 SWIG 解释。所以#include
可以确保生成的 C/C++ 代码包含该标头。
%include
,相比之下,是一个 SWIG 指令。它告诉 SWIG 在继续之前处理该头文件。通过这种方式,SWIG 将了解(并为其生成包装器)在该头文件中声明的类型和函数。
如果标头非常复杂,它可能会混淆 SWIG 或导致非常大的输出(因为 SWIG 尝试为其中的所有内容生成包装器)。在这种情况下,最好手动声明需要 SWIG 处理的标头部分,并省略 %include
。但是您仍然可能需要#include
以编译生成的 C++。
[更新]
至于“首选”,SWIG 更多的是关于什么是有效的而不是什么是“首选”......如果你有一个非常干净的头文件为单个类声明一个很好的接口,你可以只 %include
它并拥有SWIG 自动生成包装器。如果您的头文件非常多毛(例如iostream
),您应该手动告诉 SWIG 要包装什么。但没有硬性规定。
【讨论】:
【参考方案2】:%include 包含每个文件一次,这意味着您不需要包含保护。默认情况下,#include 会被忽略,除非您使用 -includeall 选项运行 SWIG。
此外,在 % 和 % 之间的任何内容都会被预处理器忽略并复制而不对输出进行任何修改。
您可以阅读以下内容:http://www.swig.org/Doc1.3/Preprocessor.html。
【讨论】:
哎哟。如果我需要多次 %include 同一个文件怎么办(由于每次都将预处理器宏设置为不同的值?)以上是关于“%include”和“#include”之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
“#include<”和#include之间的区别[关闭]
#include <文件名>和#include“文件名”之间的区别[重复]
require、include、require_once 和 include_once 之间的区别?