如何为 return 特定类型的函数创建 SWIG 类型映射

How to create a SWIG typemap for functions that return specific type

我正在尝试为 return 特定类型的函数创建 SWIG 类型映射。

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

t_float get()
{
    return 3.14159;
}

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

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

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

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

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

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

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

N.B.: 请立即改掉将值显式转换为所需类型的习惯。这很危险,因为如果类型不匹配,你就是在告诉编译器“无论如何都要将这个位模式解释为所需的类型,我知道我在做什么”。让编译器为你做隐式转换。如果类型不可转换,您还会收到编译器错误,这比运行时出现分段错误或垃圾值要好得多。请参阅此 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, );
    ++SWIG_arg;
}

t_float get();
local t_float = require("t_float")
print(t_float.get())