Как установить глобальный указатель C ++ для lua_State - PullRequest
1 голос
/ 10 ноября 2019

Как один раз установить глобальный указатель c ++ для lua_State. И получить его из функции 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;
}

Я могу установить один раз и войти во все мои глобальные функции.

Это указатель прохода C ++ в контексте Lua

1 Ответ

0 голосов
/ 11 ноября 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...