将非全局的 C++ 对象传递给 Lua 函数(Swig)

我正在使用 lua 扩展接口,并遇到一个问题,我需要将指向对象的指针传递给 lua 代码以进行操作。这些类已经通过 SWIG 进行了封装,我可以使用 swig 在 lua 中实例化它们,但那将给我带来无用的对象。

我需要能够将回调对象传递给 lua,以及表示事件对象的对象。我不能手动定义回调函数为全局变量,因为那会引入不可接受的约束。

因此,以一个通用的例子为例,如果有一个类 C 和一个在 lua 中需要一个参数的函数,我该如何调用该 lua 函数,并同时传递类型为 C 的 C++ 指针?

原文链接 https://stackoverflow.com/questions/2395501

点赞
stackoverflow用户285151
stackoverflow用户285151

我没有使用过Swig来处理C++和Lua的代码,但是你可以使用两种不同的方式(userdata和closures)在不使用Swig的情况下实现。我不知道Swig是否会对此造成干扰。

使用Userdata

lua_pushcclosure

2010-03-07 08:40:02
stackoverflow用户57482
stackoverflow用户57482

哇,回答了自己的问题,但我找到了它!

http://lua-users.org/lists/lua-l/2007-05/msg00053.html

你好 Joey,

我几乎所有的 SWIG-LUA 工作都是从 lua 方面进行的。Swig 对于将 C/C++ 库封装成可以被 lua 读取的代码非常好。让 C++ 与 lua 通信相当容易,但文档不够详细。

你的 lua_pushlightuserdata() 的想法很接近,但不完全正确。你可能想要这样做:

Foo* p= new Foo();
SWIG_NewPointerObj(L,p,SWIGTYPE_p_Foo,1);
lua_setglobal (L, "p");

SWIG_NewPointerObj() 创建了一个 userdata(而不是 lightuserdata)用于 foo 对象,并将其推送到堆栈。最后一个参数(在这种情况下为 1)是指你想要 lua 管理内存(为 0 则不需要,为 1 则需要)。

SWIG_NewPointerObj()SWIGTYPE_p_Foo 都可以在包装文件中找到。

一旦你拥有了它,你就可以在 lua 中做到这一点:

print(p)
print(swig_type(p))
p:some_function()

如果你有其他问题,请告诉我。祝好,Mark

2010-03-07 11:24:36