我們先來看乙個簡單的例子:
lua_state* l =null;//內部呼叫lua函式
double f(double x, double y)
int main(void)
functest.lua:
f = function(a, b)
return a +b
end
這其中最關鍵的是呼叫函式的使用,在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。
Lua中呼叫C函式
lua利用乙個虛擬的堆疊來給c傳遞值或從c獲取值。每當lua呼叫c函式,都會獲得乙個新的堆疊,該堆疊初始包含所有的呼叫c函式所需要的引數值 lua傳給c函式的呼叫實參 並且c函式執行完畢後,會把返回值壓入這個棧 lua從中拿到c函式呼叫結果 1 typedef struct lua state lu...
lua呼叫c函式
最近在進入lua程式設計的狀態,一度令我困惑的是,lua提供的功能少的可憐,跟自備電池的python相比,可說是簡陋了。連table的列印,都需要自己實現,也因此有了一打的第三方方案。後來我想明白了,以lua和c如此緊密的關係,只需要建立lua的binding,那麼豐富而效能強大的c庫資源完全可以為...
lua呼叫c函式
lua可以呼叫c函式的能力將極大的提高lua的可擴充套件性和可用性。對於有些和作業系統相關的功能,或者是對效率要求較高的模組,我們完全可以通過c函式來實現,之後再通過lua呼叫指定的c函式。對於那些可被lua呼叫的c函式而言,其介面必須遵循lua要求的形式,即 typedef int lua cfu...