c++和Lua:自动注册函数

C++ and Lua: automatically register functions

本文关键字:注册 函数 Lua c++      更新时间:2023-10-16

当我在c#中使用Lua时,我会为我想在Lua中注册的方法添加属性,就像这样:

// place tile marker
[LuaExport("settilemarker")]
public void SetTileMarker(int x, int y)
{
    TileEditor.X = x;
    TileEditor.Y = y;
}

然后,我会在运行时使用反射来查找所有这些函数并自动注册它们,使用一小段不必为每个新函数更新的代码。这也可以用来自动建立一个列表的所有注册命令很容易等。

我的问题是,有什么办法做到这一点与Lua在c++ ?比如某种宏之类的。这些信息不一定要在运行时可用,我只是想方便地在每个函数定义的地方标记它,并使它们都自动注册,而不是在lua_register(..)s的某个地方有一个长段。

我已经找到了一些工具,似乎能够生成代码,但我希望可能有一种方法,不需要任何额外的手工工作,除了点击构建。如果没有,我将不得不进一步研究这些工具。

顺便说一下,使用Visual Studio 2010。

C和c++没有反射。因此,您使用的任何工具都至少需要一些手工工作。对于每个想要导出的函数,你都必须键入,或者你必须将原型放到一个特殊的位置或其他地方。

有一个可用的Lua绑定实用程序列表。其中一些是半自动的,包括可以读取c++子集并半自动为其生成绑定代码的解析器。SWIG、toLua和toLua++就是其中之一。另一些则需要更多的工作,但使显式声明行为(如所有权等)变得更容易一些。

您想要编写的语法与使用Luabind将c++函数导出到Lua时编写的语法类似。

我曾经直接使用Lua C API来集成Lua和c++,但是,自从我发现了Luabind,我再也没有这样做过。

在你的程序初始化中,你可能有这样的东西:

#include <lua.hpp>
#include <luabind/luabind.hpp>
lua_State * L = luaL_newstate();
luaL_openlibs(L);
luabind::open(L);
luabind::module(L) [
    luabind::def("settilemarker", &SetTileMarker)
];

如果SetTileMarker不是一个自由函数,而是一个类Foo的方法,那么你应该这样做。

luabind::module(L) [
    luabind::class_<Foo>("foo")
        .def("settilemarker", &Foo::SetTileMarker)
];

这并不像能够在所有地方分发您的注册那么漂亮,但我发现它比直接使用Lua C API更容易和更符合语法。

您看过SWIG吗?我用过它,虽然有点复杂,但它确实为您自动化了许多事情。