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

如何在 C++ 中为 lua_State 设置全局的指针,并从 C 函数中获取它。

Context *context = new Context();
lua_State *lua = luaL_newstate();

// 将 context 存储在 lua 状态中

lua_pushcfunction(lua, fn_one);
lua_setglobal(lua, "one");
// 注册其他全局函数

我将从所有函数中获取它

int fn_one(lua_State *lua)
{
   Context * context = (Context *) lua_touserdata(lua, -1);
   // context 为空或获取对象时发生错误
   return 0;
}

我可以设置一次并在所有全局函数中获取它。

这是为了在 Lua 上下文中传递 C++ 指针

点赞
用户1944004
用户1944004

最简单的方法可能是将指针作为轻量级用户数据推入同一个模块中。这样,你可以通过将其作为参数简单地传递到每个 Lua 函数中来轻松地访问资源。

你还可以使用一个上值,在 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

在 Wandbox 上的实时示例

2019-11-11 04:42:44