如何在lua中使用带有C代码的...运算符

时间:2010-08-05 07:03:27

标签: lua variadic-functions

我有一个函数,它在C中接受可变数量的参数,我想传递给另一个lua函数。在纯粹的Lua中我可以做这样的事情

function foo(...)
    print(...)
end

如果我要在C中实现该功能,我将如何做同样的事情?

编辑:我可能措辞不好。我想要做的是使用Lua API在C中编写上面的函数foo,但是我不知道如何将我从Lua堆栈中获取的参数传递给print,因为我不知道有多少,我找不到任何方法来检查。

3 个答案:

答案 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”或其他东西,但这完全是另一回事。