1 回答

TA貢獻1757條經驗 獲得超7個贊
在C中調用Lua函數的API主要由以下幾個:
(1)void lua_call (lua_State *L, int nargs, int nresults);
函數調用,nargs表示參數的個數,nresults表示返回值的個數
首先將lua函數壓棧,然后將參數依次壓棧,最后調用函數即可
函數調用時,參數和函數都會pop出棧,調用返回后,結果會push進棧
nresults==LUA_MULTRET,所有的返回值都會push進棧
nresults!=LUA_MULTRET,返回值個數根據nresults來調整
Lua語句:
a = f("how", t.x, 14)
在C中的實現:
lua_getglobal(L, "f"); // 函數入棧
lua_pushstring(L, "how"); // 參數1入棧
lua_getglobal(L, "t"); // 表t入棧
lua_getfield(L, -1, "x"); // 參數2入棧
lua_remove(L, -2); // 跳t出棧
lua_pushinteger(L, 14); // 參數3入棧
lua_call(L, 3, 1); // 調用函數,參數和函數都會出棧
lua_setglobal(L, "a"); // 給a賦值,棧頂出棧
上述代碼執行完畢后,堆棧狀態恢復原樣。
(2)int lua_pcall (lua_State *L, int nargs, int nresults, int msgh);
函數調用,在安全模式下,并且可以添加錯誤處理函數。
如果調用期間發生error,lua_pcall會捕獲之,然后push stack一個錯誤信息(會先將函數和參數pop出棧),并且返回一個error code(非0的一個值)。
發生error時,如果指定了錯誤處理函數,會在error message入棧前調用錯誤處理函數,具體由msgh參數來決定:
(1)msgh==0,不指定錯誤處理函數,入棧信息不變;
(2)msgh!=0,msgh表示錯誤處理函數的堆棧index,錯誤處理函數會以error message為參數,并將返回的新的error
message入棧。主要用來給error
message添加 更多的debug信息,比如堆棧跟蹤,因為這些信息在pcall調用完之后是收集不到的。
函數返回代碼:
LUA_OK(0):調用成功
LUA_ERRRUN:runtime error
LUA_ERRMEM:內存分配錯誤,這種情況下不會調用錯誤處理函數
LUA_ERRERR:調用錯誤處理函數時出錯,當然,不會再進一步調用錯誤處理函數
LUA_ERRGCMM:調用metamethod.__gc時報錯,由gc引起,和函數本身沒關系
(3)int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc, int ctx, lua_CFunction k);
函數調用,在安全模式下,并且允許函數yield
- 1 回答
- 0 關注
- 157 瀏覽
添加回答
舉報