首页 > 解决方案 > 如何在 C++ 中获取 lua 函数作为参数然后调用它

问题描述

我在 C++ 中实现 lua api (5.1) 并遇到问题,无法在从 lua 调用的 c++ 函数中将 lua 函数作为参数传递。示例(从 C++ 调用主函数):

卢阿:

function Main()
    HookEntityFunction("player", 1, PlayerSpawn); -- << is this normal?
end

function PlayerSpawn()

end

C++:

int HookEntityFunction(lua_State *L)
{
    lua_CFunction F = lua_tocfunction(L, 3); -- << how to call it?
}

标签: c++lua

解决方案


您在问题中发布的答案是不正确的,或者至少是愚蠢的。

您的原始代码不起作用的原因lua_tocfunction是,顾名思义,仅适用于 C 函数。它接受一个暴露给 Lua 的 C 函数,并重新提取指向它的函数指针。由于原生 Lua 函数没有对应的 C 函数,lua_tocfunction因此无法使用它。

您提出的解决方案依赖于存储为全局的传入函数,并根据其名称获取它。这把它放在堆栈上。但是在您的第一个示例中,它已经在堆栈上!这是处理来自 C 函数的 Lua 对象的正确、惯用的方法:通过操作堆栈。

因此,解决问题的真正方法是,获取您的第一个 Lua 代码段,然后执行lua_call(L, 0, 0). 不需要全局变量或指针或任何东西。


推荐阅读