Вероятно, проще всего просто вставить указатель в виде легких пользовательских данных в тот же модуль. Таким образом, вы можете легко получить доступ к ресурсу из любой функции 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