我有一个函数,它在C中接受可变数量的参数,我想传递给另一个lua函数。在纯粹的Lua中我可以做这样的事情
function foo(...)
print(...)
end
如果我要在C中实现该功能,我将如何做同样的事情?
编辑:我可能措辞不好。我想要做的是使用Lua API在C中编写上面的函数foo,但是我不知道如何将我从Lua堆栈中获取的参数传递给print,因为我不知道有多少,我找不到任何方法来检查。
答案 0 :(得分:2)
所有lua可调用的C函数必须是lua_CFunction
类型:
typedef int (*lua_CFunction) (lua_State *L);
lua_State
可以包含可变数量的参数,如Lua 5.1参考手册的§3.7所示。你不能使用'普通'C vararg函数。
答案 1 :(得分:2)
检查堆栈上参数数量的方法是使用lua_gettop()
函数。
从C函数中尝试以下操作:
lua_getfield(L, LUA_GLOBALSINDEX, "print");
lua_insert(L, 1);
lua_call(L, lua_gettop(L)-1, 0);
lua_call()
将弹出堆栈中的所有参数,因此如果要保留它们,则需要稍微调整它以复制所有参数。
int args=lua_gettop(L);
if(lua_checkstack(L, args+1))
{
int i;
lua_getfield(L, LUA_GLOBALSINDEX, "print");
for(i=1;i<=args;i++)
lua_pushvalue(L, i);
lua_call(L, args, 0);
}
else
{
return luaL_error(L, "cannot grow stack");
}
答案 2 :(得分:1)
在schot的链接中稍微阅读后,我想我已经回答了我自己的问题。 lua_gettop会告诉我传入的参数数量,所以我知道需要将内部函数推送到堆栈的内容。
我只是没想到函数检查堆栈大小被称为“gettop”。我本来期望“checkstack”或其他东西,但这完全是另一回事。