[namespace]
namespace nsTest1
{
int nsAdd(int a, int b)
{
return a + b;
}
} namespace nsTest2
{
int nsAdd(int a, int b)
{
return a + b;
}
}
有如上代码ns.h, 如果直接用swig导出, 则会报命名冲突的错误。需要用rename进行特殊处理, 如下:
//防止命名冲突错误。
%rename(nsAdd2) nsTest2::nsAdd;
%include "ns.h";
[宏]
[typedef]
有头文件typedef_.h
typedef float hkFloat32; typedef hkFloat32 hkReal;
如果在swig的导出接口中用到如上定义, 如:
inline hkReal _myAdd(hkReal a, hkReal b)
{
return a + b;
}
则swig无法识别hkReal。可用如下的办法解决:
//用于告诉swig hkReal的定义
// %inline
// %{
// typedef float hkFloat32;
//
// typedef hkFloat32 hkReal;
// %}
//直接包含头文件也能达到同样的效果。
%include "typedef_.h"
[template]
template<typename T>
T testAdd(const T &a, const T &b)
{
return a + b;
}
用如下办法导出需要导出的类型:
%template(testAdd_int) testAdd<int>;
%template(testAdd_float) testAdd<float>;
[overload]
要看脚本语言是否支持重载, 如果不支持, swig只会导出第一个接口, 其他的重载接口会被忽略。
[默认参数]
[copy constructor]
因为as3本身是没有拷贝构造函数的概念, 而swig会把c++的copy constructor生成一个对应function wrapper, 但是没有名称, 所以之后编译.as文件会报错。解决方法:
直接在.i文件中ignore掉copy constructor.
[operator]
官方文档上说swig对待操作符重载, 就如同对待一个普通函数, 但是导出的接口类似于operator +, 这种形式在大部分的脚本语言中都是非法的函数命名, 所以为了解决这个问题, 依然可以用%rename进行解决。