【问题标题】:How to create a SWIG typemap for functions that return specific type如何为返回特定类型的函数创建 SWIG 类型映射
【发布时间】:2018-07-08 14:06:14
【问题描述】:

我正在尝试为返回特定类型的函数创建一个 SWIG 类型映射。

例如,这是我的 C++ 函数

t_float get()
{
    return 3.14159;
}

t_float 定义为floatdouble,具体取决于一个头文件上的#define 设置。即使我在i 文件中包含标头,SWIG i 文件似乎也无法读取该文件中定义的符号。

所以,我决定为这个函数创建一个类型映射,以便t_float 类型可以转换为lua_number

但我不知道如何为返回值的函数创建类型映射。

我尝试自己做,但我做不到。

%typemap(out) t_float
{
    lua_pushnumber(L, (lua_Number)($output));
}

如何正确创建类型映射,以便我可以让 get() 在 Lua 中返回一个数字值?

【问题讨论】:

    标签: c++ lua swig typemaps


    【解决方案1】:

    这有点棘手。将结果推送到堆栈后,您还必须增加存储在SWIG_arg 中的返回值的数量。我是在查看 SWIG 的内部类型映射后才发现的。 (名为$output 的标识符不存在)。

    注:请立即放弃将值显式转换为所需类型的习惯。这很危险,因为如果类型不匹配,您就是在告诉编译器“无论如何都要将此位模式解释为所需的类型,我知道我在做什么”。只需让编译器为您进行隐式转换即可。如果类型不可转换,您还将收到编译器错误,这比运行时的分段错误或垃圾值要好得多。请参阅此Wandbox link 进行演示,并注意没有编译器警告!

    %module t_float
    %{
    typedef double t_float;
    t_float get() {
        return 3.14159;
    }
    %}
    
    %include <typemaps.i>
    
    %typemap(out) t_float {
        lua_pushnumber(L, $1);
        ++SWIG_arg;
    }
    
    t_float get();
    
    local t_float = require("t_float")
    print(t_float.get())
    

    【讨论】:

    • 感谢您的回答!但是static_cast 使用起来不安全吗?我认为它会产生编译器警告。
    • @ZackLee static_cast 只对值安全。它仍然允许你将void* 投射到任何你想要的东西。我的编译器没有产生警告。如果是这样,请至少使用 static_cast 而不是 C 风格的演员表。
    • 我会的,谢谢先生!
    猜你喜欢
    • 2019-02-06
    • 1970-01-01
    • 2019-12-09
    • 2019-01-09
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    相关资源
    最近更新 更多