如何在C代码中使用Lua的...运算符

我在 C 语言中有一个接受可变参数的函数,我想将它传递给另一个 Lua 函数。在纯 Lua 中,我可以这样做:

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

如果我想在 C 语言中实现相同的功能,我该怎么做呢?

编辑:可能我的措辞不太准确。我想用 Lua API 在 C 语言中编写上面的 foo 函数,但我不知道如何将从 Lua 栈中获取的参数传递给 print 函数,因为我不知道有多少个参数,并且找不到任何检查的方法。

原文链接 https://stackoverflow.com/questions/3412434

点赞
stackoverflow用户251122
stackoverflow用户251122

所有可在 Lua 中调用的 C 函数都必须是 lua_CFunction 类型:

typedef int (*lua_CFunction) (lua_State *L);

lua_State 可以包含不确定数量的参数,如 Lua 5.1 参考手册 §3.7 中所示。你不能使用一般的 C 可变参数函数。

2010-08-05 07:16:02
stackoverflow用户63791
stackoverflow用户63791

在阅读schot链接向下一点之后,我认为我已经回答了自己的问题。lua_gettop会告诉我传递了多少个参数,因此我知道需要将什么推送到内部函数的堆栈上。

我只是没想到函数检查堆栈大小被称为“gettop”。我本来期望是"checkstack",但那实际上是做另一件事。

2010-08-05 07:23:41
stackoverflow用户173806
stackoverflow用户173806

使用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");
}
2010-08-06 18:16:41