lua與C(一) C呼叫lua

2021-06-08 06:35:31 字數 2531 閱讀 7512

lua和c有兩種關係:

一種是在lua中呼叫c的函式,c稱為庫**,一種是c中呼叫lua,c就稱為應用程式**,此時c中包含了lua的直譯器

c**部分

注意在c++中,通常要把lua的一些標頭檔案定義在extern 「c」中,因為他們是c語言實現的。

1.作為應用程式呼叫lua**:

char* buffer="print(\"hello,lua\")";

lua_state* ls=lual_newstate();

int error;

lual_openlibs(ls);

error=lual_loadbuffer(ls,buffer,strlen(buffer),"line");

printerror(ls,error,"loaderror");

error=lua_pcall(ls,0,0,0);

printerror(ls,error,"callerror");

error=lual_loadfile(ls,"1.lua");

printerror(ls,error,"loaderror");

error=lua_pcall(ls,0,0,0);

printerror(ls,error,"callerror");

lua_close(ls);

getchar();

return ;

所有lua相關的東西都儲存在lua_state這個結構中,lual_loadbuffer=lual_loadfile載入lua**,

lua_pcall安全的執行lua**,他將lua**在保護模式下執行,不會導致程式的crash,如果想保護與lua互動的c**,則可以使用lua_cpcall,他接受的是乙個c函式

與lua**間訪問交換資料

c和lua之間採用棧的方式交換資料。兩邊**可以使用各種api將資料壓入到乙個公用的棧中,或者利用api從這個棧中取出資料。而事實是幾乎所有的api函式都會使用這個棧。棧的空間是有限的,至少有20個。如果c**作為乙個庫函式被lua呼叫,在可能出錯的地方要呼叫lua_error,來保證在lua中執行時的安全。

另外這個棧不是乙個全域性的概念,每個函式都有自己的區域性私有棧,當lua呼叫乙個c函式時,第乙個引數總是這個區域性棧的索引1

2壓入c元素到棧

void pushnil/boolean/number/integer/string/lstring/...這些函式壓入不同型別的資料到棧

壓入乙個空表

lua_newtable

設定棧中table的值:

1.先壓入索引key

2.壓入value

3.呼叫lua_settable(lua_state,index),設定index處的表的[key]=value,注意這個函式結束會彈出key和value

3壓入lua元素到棧

lua_getglobal()將lua中的某個全域性變數壓入棧中

4 從棧中獲取lua元素

int lua_toboolean(luastate *l,int index) 等函式

棧的檢索index正數開始代表從棧地開始的順序,負數代表從棧頂的順序

可以先使用 lua_is*函式檢測這個元素是不是所要型別或lua_type直接得到他的型別

獲取table元素:

1.將元素的key壓入到棧中 lua_pushstring

2.使用lua_gettable(lua_state,index)這裡index是table的索引,這個函式可以獲取這個table的索引為key的值,注意這個函式結束會彈出key並將value放於棧頂

*對於字串索引,可以用lua_getfield(lua_state,index,key)來直接獲取

5從棧中獲取元素設定給lua變數

lua_setglobal("l",name) 將棧頂元素給lua的name變數 ,然後彈出棧

6其他棧操作

lua_gettop得到棧中棧頂的位置,也就是資料的數量 lua_settop設定棧頂元素此外還有insert remove等在棧中間操作的各種操作

7呼叫lua函式

1.壓入lua函式到棧lua_getglobal

2.按引數從左到右順序將c變數作為引數壓入棧

3.使用lua_pcall呼叫lua_pcall(lua_state,引數個數,返回值個數,錯誤處理函式索引),然後引數和函式被彈出,結果被先後壓入棧

如果出錯,lua_pcall將返回乙個非零值,然後壓入一條錯誤訊息到棧

Lua與C 呼叫Lua函式(三)

lua允許在乙個文字中定義函式,並且可以通過c語言來呼叫這個函式。先將帶呼叫的函式壓棧,並壓入函式的引數。然後是用lua pcall進行實際呼叫。最後,將呼叫結果從戰中彈出。lua函式 function add x,y return x y end c language double add lua...

Lua與C 互動初探之C 呼叫Lua

lua與c 互動初探之c 呼叫lua 一 lua環境的搭建 他包括以下元件 lua examples 包含lua使用的一些例子。luaforwindows documentation luaforwindows這款軟體的一些說明 quickluatour lua快速入門嚮導,沒什麼用,看看就好 do...

Lua與C 互動初探之C 呼叫Lua

一 lua環境的搭建 他包括以下元件 lua examples 包含lua使用的一些例子。luaforwindows documentation luaforwindows這款軟體的一些說明 quickluatour lua快速入門嚮導,沒什麼用,看看就好 scite lua的乙個不錯的文字編輯器。...