[namespace]
1 namespace nsTest1 2 { 3 int nsAdd(int a, int b) 4 { 5 return a + b; 6 } 7 } 8 9 namespace nsTest2 10 { 11 int nsAdd(int a, int b) 12 { 13 return a + b; 14 } 15 }
有如上代码ns.h, 如果直接用swig导出, 则会报命名冲突的错误。需要用rename进行特殊处理, 如下:
//防止命名冲突错误。
%rename(nsAdd2) nsTest2::nsAdd;
%include "ns.h";
[宏]
[typedef]
有头文件typedef_.h
1 typedef float hkFloat32; 2 3 typedef hkFloat32 hkReal;
如果在swig的导出接口中用到如上定义, 如:
1 inline hkReal _myAdd(hkReal a, hkReal b) 2 { 3 return a + b; 4 }
则swig无法识别hkReal。可用如下的办法解决:
//用于告诉swig hkReal的定义
// %inline
// %{
// typedef float hkFloat32;
//
// typedef hkFloat32 hkReal;
// %}
//直接包含头文件也能达到同样的效果。
%include "typedef_.h"
[template]
1 template<typename T> 2 T testAdd(const T &a, const T &b) 3 { 4 return a + b; 5 }
用如下办法导出需要导出的类型:
%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进行解决。