C中呼叫Lua函式

2022-02-08 06:01:34 字數 2091 閱讀 8314

我們先來看乙個簡單的例子:

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...