首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C++中的全局表调用Lua函数

从C++中的全局表调用Lua函数
EN

Stack Overflow用户
提问于 2014-07-21 01:49:36
回答 1查看 936关注 0票数 0

我在全局Hooks表中定义了一些Lua函数如下:

代码语言:javascript
复制
print("Loading Hook System")
local pairs = pairs;
Hooks = {}
Hooks.Hooks = {}
----------
--  This file defines all the available hooks
----------
Hooks.Hooks.OnScoreboardOpen = {}


function Hooks.Add( Name, Identifier, Function )
    if (Hooks.Hooks[Name] == nil) then
        print("Hook "..Name.." Does Not Exist")
    else
        if (Hooks.Hooks[Name][Identifier] == nil) then
            Hooks.Hooks[Name][Identifier] = Function
        else
            print("Hooks.Add Error: Identifier: "..Identifier.." Already Exists")
        end
    end
end

function Hooks.Remove( Identifier )
    for _,Hook in pairs(Hooks.Hooks) do
        if (Hook[Identifier]) then
            Hook[Identifier] = nil
        end
    end
end

function Hooks.Call( Name, ... )
    local arg = {...}
    for _,v in pairs(Hooks.Hooks[Name]) do
        v(unpack(arg))
    end
end

print("Complete")

然后,用户可以使用唯一标识符将自己的函数添加到钩子系统中,然后在需要时删除它们。

我需要弄清楚如何从Hooks.Call()内部调用C++函数,但我只知道如何调用全局函数,而不知道如何调用全局范围内的表中的函数。实现Hooks.Call()完全在C++中所做的一种方法将是最有效的途径。

这允许我从C++调用Lua函数。

代码语言:javascript
复制
lua_getglobal(m_Lua, "Hooks");
lua_getfield(m_Lua, -1, "Call");
lua_pushstring(m_Lua, "OnScoreboardOpen");
lua_pushnumber(m_Lua, 5);
lua_pushnumber(m_Lua, 7);
int Error = lua_pcall(m_Lua, 3, 0, 0);
if (Error)
{
    std::cout << lua_tostring(m_Lua, -1) << std::endl;
}

这段代码完成了吗?在这一点上堆栈清楚吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-22 08:27:52

你的代码在我看来没问题。

  • 您已经将Hooks表留在堆栈中。您可以在调用lua_getfield之后立即删除它。或者,将"table.field“检索封装在实用程序函数中。也就是getglobal2(m_Lua, "Hooks", "Call")的一些东西。
  • 您还会在堆栈上留下错误消息。你得把它爆了。

或者,将代码包装在Lua函数中(写在C端),并通过lua_pushcfunction & lua_pcall调用它。这样,堆栈将自动为您管理。

顺便说一句,你可以做v(...)而不是v(unpack(arg))

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24856691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档