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
吗?
我发现,如果将多个参数传递给 func1
,func2
中 lua_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
.
假设我在 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()
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
.