[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进行解决。

05-02 13:40