如何为lua_State设置全局C ++指针

时间:2019-11-09 21:01:38

标签: c++ lua

如何一次为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 ++指针

1 个答案:

答案 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

Live example on Wandbox