C++和Lua:自动注册函数
当我在C#中使用Lua时,我会向我想要在Lua中注册的方法添加属性,类似于这样:
// place tile marker
[LuaExport("settilemarker")]
public void SetTileMarker(int x, int y)
{
TileEditor.X = x;
TileEditor.Y = y;
}
然后,在运行时我会使用反射来查找所有这些函数并自动地注册它们,使用一个不必为每个新函数更新的简短代码。 这也可以用于自动构建所有已注册命令的列表等。
我的问题是,有没有办法在C++中使用Lua做到这一点?像某种宏之类的东西。 这些信息在运行时不必可用,我只是想方便地标记每个函数的定义,并使它们自动注册,而不是有一个长的lua_register(..) somewhere的区域。
顺便说一下,我已经找到了一些工具,似乎能够生成这个功能所需的代码,但我希望有一种不需要除了点击Build之外的其他手动工作的方法。 如果没有,我将不得不仔细研究这些工具。
顺便说一下,使用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更容易理解和编写语法。
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

你是否了解 SWIG 这个工具。我曾经使用过它,虽然它有点复杂,但它确实可以自动化许多事情。