如何为 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
定义为 float
或 double
,具体取决于一个 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())
我正在尝试为 return 特定类型的函数创建 SWIG 类型映射。
例如,这是我的 C++ 函数
t_float get()
{
return 3.14159;
}
t_float
定义为 float
或 double
,具体取决于一个 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())