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

  • 相关阅读:
    TortoiseGit 合并主分支代码.pull request
    MVC EF 修改某些值
    MVC 提交表单
    MVC 统计之 自定义 列表
    MVC 起始页修改 区域
    asp.net C# MVC DropDownList
    asp.net C# MVC 提交表单后清空表单
    Python 线程启动的四种方式
    Git 命令的学习
    Node.js v10.1.0 Documentation
  • 原文地址:https://www.cnblogs.com/zilongblog/p/4916292.html
Copyright © 2020-2023  润新知