我有使用Lua C API的問題。當pcall(C API函數)失敗時,錯誤被壓入堆棧。 lua_tostring
在堆棧上顯示錯誤,但lua_gettop
顯示堆棧爲空。Lua C API:pcall錯誤後堆棧爲空
#include <lua5.2/lauxlib.h>
#include <lua5.2/lua.h>
#include <lua5.2/lualib.h>
int main()
{
lua_State *L = luaL_newstate();
lua_pcall(L, 0, 0, 0);
printf("%d\n", lua_gettop(L)); // outputs 0, indicating empty stack
printf("%s\n", lua_tostring(L, -1)); // outputs "attempt to call a nil value", indicating non-empty stack
}
編譯:GCC main.c中`pkg配置--cflags lua5.2``pkg配置--libs lua5.2`
該節目顯示:試圖調用零值
lua_gettop(L)返回堆棧大小。這裏我得到0.我怎樣才能從一個空的堆棧中獲得一個字符串?
行爲與5.1版本相同。
不知道他爲什麼認爲他什麼都不能打電話...... –
我想你誤解了這個問題。他*知道'luaL_newstate'後面的堆棧是空的,他知道*你需要在棧上推一個函數來調用它;他迫使pcall非常刻意地產生一個錯誤。問題是爲什麼在pcall *已經將錯誤消息推送到它上面之後棧頂仍然爲0?他的輸出顯示堆棧上有*錯誤消息(「嘗試調用一個零值」),但lua_gettop返回0,根據手冊[指示一個*空棧*](http:// www .lua.org /手動/ 5.1/manual.html#lua_gettop)。 – Mud
@Mud,Lua API不牽手。如果你給它垃圾,你可能會得到垃圾。 'lua_pcall'假定在被調用的堆棧上有一個函數。 – lhf