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

How to set global C++ pointer for lua_State

本文关键字:设置 全局 C++ 指针 State lua      更新时间:2023-10-16

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

将指针作为轻用户数据推入同一模块可能是最简单的。这样,只需将每个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

Wandbox 上的实时示例