Lua 调用注册的 C 函数并调用另一个 C 函数。

假设我在 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 吗?

我发现如果向 func1 传递了若干参数,则在 func2 中返回的 lua_gettop() 值没有意义。

例如,在我的 Lua 脚本中向 func1 传递了 3 个参数,则 lua_gettop()func1 中返回 3,在 func2 中返回不少于 3。这绝对是错误的,因为 lua_gettop() 应该返回当前函数传递的参数数量。

所以,在调用 func2 之前,我应该进行一些堆栈技巧,比如设置新堆栈帧,还是应该不要这样做?

点赞
用户7806
用户7806

lua_gettop 不返回参数的数量,而是返回栈中项的数量。如果您在调用函数中操纵堆栈,当您直接调用另一个 C 函数时,它将保持操纵过的状态。

如果您通过 Lua 调用它(例如使用 lua_cpcall),它将开始具有自己的堆栈状态和您在 Lua 中给出的参数。

2015-09-20 17:34:39
用户2555321
用户2555321

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

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

这就是为什么获取函数参数时要这样做的原因:

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

而对于返回结果,你需要 push 回本地堆栈:

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

return 2; // 返回的参数数量

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

2017-07-14 17:22:20