swig之于c++

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

原文地址:https://www.cnblogs.com/zilongblog/p/4916292.html