3

假设我在 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...
}

问题是:我可以func2在内部打电话func1吗?

我发现如果将多个参数传递给func1,则lua_gettop()返回的值func2毫无意义。

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

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

4

2 回答 2

4

lua_gettop不返回参数的数量,而是返回堆栈上的项目数。如果你在调用函数中弄乱了堆栈,那么当你直接调用另一个 C 函数时,它仍然会乱七八糟。

如果您通过 Lua 调用它(例如 using lua_cpcall),它将以它自己的堆栈状态和您在 Lua 中提供的参数开始。

于 2015-09-20T17:34:39.493 回答
0

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

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

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

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.

于 2017-07-14T17:22:20.373 回答