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

标签 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++ 指针

最佳答案

将指针作为轻量级用户数据推送到同一个模块中可能是最简单的。这样您就可以轻松地从每个 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

Live example on Wandbox

关于c++ - 如何为 lua_State 设置全局 C++ 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58783450/

相关文章:

c++ - 函数的完整列表,来自 c++ 的 MS Word 命令

Lua中的异步延迟? (如 JavaScript setTimeout)

c++ - Lua协程

arrays - Lua中不区分大小写的数组

c++通过csv文件和最后一列进行解析

c++ - 将类(mixins)的功能与歧义调用结合起来

c++ - 使用RAII填充成员对象图并使用智能指针存储一个成员的正确方法

c++ - std::cout<< ' ' <<std::endl;输出一个数字;为什么?

lua - Torch Lua,如何计算两个张量的每对单值的余弦距离?

animation - 有没有更好的方法来连接 Corona Lua 中的转换?