我想在Lua和C中处理以下代码:
假设我有一个名为Foo
的C函数绑定到Lua。我称之为Lua脚本:
Foo(15, "bar", function(z) return 2 * z + 1 end)
在C方面,我检索参数,我可以在我的结构中存储数字和字符串。但是我需要哪种数据类型来存储匿名函数?我怎么能在以后再打电话呢?
答案 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)