Lua 已注册 C 函数调用另一个函数

Lua registered C function calling another one

假设我在 Lua 范围内注册了两个 C 函数:

int func1(lua_State* L)
{
    int n = lua_gettop(L);
    // Do sth here...
}

int func2(lua_State* L)
{
    int n = lua_gettop(L);
    // Do sth here...
}

问题是:我可以在 func1 内调用 func2 吗?

我发现,如果将多个参数传递给 func1func2lua_gettop() return 的值就没有意义。

例如,如果在我的 lua 脚本中将 3 个参数传递给 func1,那么 lua_gettop() returns 3 in func1,并且不少于比 func2 中的 3 个。这绝对是错误的,因为 lua_gettop() 应该 return 传递给当前函数的参数数量。

所以我应该在调用 func2 之前做任何堆栈技巧,例如设置新的堆栈框架,还是根本不应该这样做?

lua_gettop 不是 return 个参数,而是堆栈中的项目数。如果你在调用函数中弄乱了堆栈,当你直接调用另一个C函数时,它仍然是乱糟糟的。

如果您通过 Lua 调用它(例如使用 lua_cpcall),它将以它自己的堆栈状态和您在 Lua.[=13= 中给它的参数开始]

不,你不应该在 func1 中直接调用 func2,每个函数都有一个本地堆栈。

正如@che 所写,lua_gettop returns 堆栈中的项目数,因此您可以使用 lua_gettop 获取传递给函数的参数,因为 每个函数都有一个本地堆栈.

这就是为什么要像这样获取函数的参数:

lua_tostring(L, 1);
lua_tointeger(L, 2);
lua_to...(L, i);

为了返回结果,您推回本地堆栈:

lua_pushstring(L, "hello");
lua_pushinteger(L, 1);

return 2; // number of arguments returned

如果您想从 C 中调用 lua 函数,请使用 lua_pcall.