调用Lua函数

时间:2011-06-22 23:18:12

标签: c api lua

我想在Lua和C中处理以下代码:

假设我有一个名为Foo的C函数绑定到Lua。我称之为Lua脚本:

Foo(15, "bar", function(z) return 2 * z + 1 end)

在C方面,我检索参数,我可以在我的结构中存储数字和字符串。但是我需要哪种数据类型来存储匿名函数?我怎么能在以后再打电话呢?

5 个答案:

答案 0 :(得分:6)

您不能将Lua函数存储为C数据类型,只能将Lua表存储为C数据类型。

您可以使用the registry来存储此值。注册表是一个全局可用的表,供所有C用户存储数据。为所有代码选择一个密钥并在该密钥上放置一个表通常是个好主意。此表将包含要保留的值。这将有助于减少使用注册表的其他C代码的冲突。

答案 1 :(得分:4)

您可以将函数保留在堆栈中的某个位置,也可以使用luaL_ref将其保存在注册表或其他表中。

答案 2 :(得分:4)

通常,您不会将函数存储在C变量中。你把它留在堆栈上并用pcall()调用它。类似的东西:

int l_Foo(lua_State *L)
{
  lua_pop(L, 2);         /* ignore the first two args */
                         /* (the function is now on top of the stack) */
  lua_pushnumber(L, 2);  /* push the number to pass as z */
  lua_pcall(L, 1, 1, 0); /* call the function with 1 argument, expect 1 result */
  lua_pop(L, 1);         /* ignore the result */
}

为简洁起见,我省略了一些错误检查,但请参阅Programming in Lua以获取更完整的示例,并the Lua Reference Manual了解有关这些功能的详细信息。

答案 3 :(得分:1)

此页面也可能有所帮助:http://www.lua.org/pil/25.2.html

而且:http://www.luafaq.org/#T7.2

似乎在这里得到了回答: how to callback a lua function from a c function

答案 4 :(得分:0)

一种方法是做匿名功能的工作 在 lua方并将函数的结果传递给 FOO(int, char*, fun_result_type fun_result)