如何一次为lua_State设置全局c ++指针。并从C函数获取它。
Context *context = new Context();
lua_State *lua = luaL_newstate();
// Store context in lua state
lua_pushcfunction(lua, fn_one);
lua_setglobal(lua, "one");
// Register other global functions
我将从所有功能中得到它
int fn_one(lua_State *lua)
{
Context *context = (Context *) lua_touserdata(lua, -1);
// context is null or error get object
return 0;
}
我可以设置一次并获得我的所有全局功能。
这是用于在Lua上下文中传递C ++指针
答案 0 :(得分:1)
将指针作为轻用户数据推入同一模块可能是最简单的。这样,您只需将其作为参数传递即可轻松地从每个Lua函数访问资源。
您还可以使用一个upvalue,它在C闭包内部隐式可用,而不必将其作为参数传递。我已经在其他地方回答了这个问题:https://stackoverflow.com/a/51337524
#include <lua.hpp>
struct Context {
int i;
};
int fn_one(lua_State *L) {
luaL_checkany(L, 1);
Context *context = static_cast<Context *>(lua_touserdata(L, 1));
lua_pushinteger(L, context->i);
return 1;
}
extern "C" int luaopen_example (lua_State *L) {
Context *context = new Context{42};
lua_newtable(L);
lua_pushcfunction(L, fn_one);
lua_setfield(L, -2, "one");
lua_pushlightuserdata(L, context);
lua_setfield(L, -2, "ctx");
return 1;
}
local ex = require("example")
print(ex.ctx)
print(ex.one(ex.ctx))
$ g++ -Wall -Wextra -Wpedantic -I /usr/include/lua5.3/ -shared -fPIC -o example.so example.cpp
$ lua5.3 test.lua
userdata: 0x55a81d6af920
42