Lua和C的互動說明(函式)

2021-07-22 13:53:56 字數 4527 閱讀 3199

void

lua_newtable

(lua_state *l

);--等價於

lua_createtable(l

,0,0

);

建立乙個空table,並將之壓入堆疊。

int

lua_gettop

(lua_state *l

);

返回棧頂元素的索引。因為索引是從1開始編號的,所以這個結果等於堆疊上的元素編號(因此返回0表示堆疊為空)。

int

lual_newmetatable

(lua_state *l

,const

char

*tname

);

如果登錄檔中已經有key為tname的資料則返回0。否則建立乙個新錶作為userdata的metatable,並在登錄檔中註冊它然後返回1。不過兩種情況都會把登錄檔中tname相關的值壓入堆疊。

void

*lual_checkudata

(lua_state *l

,int

narg

,const

char

*tname

);

查詢堆疊上某個資料是否相關型別

void

lua_pushstring

(lua_state*l

,const

char*s

);

把指標s指向的以零結尾的字串壓棧。lua對這個字串做一次記憶體拷貝(或是復用乙個拷貝),因此s處的內存在函式返回後,可以釋放掉或是重用於其它用途。字串中不能包含有零字元;第乙個碰到的零字元會認為是字串的結束。

void

lua_pushlstring

(lua_state *l

,const

char*s

,size_t

len);

同上,只是多了乙個長度限制。

void

lua_pushvalue

(lua_state *l

,int

index

);

把堆疊上給定有效處索引處的元素作為乙個拷貝壓棧。

void

lua_settable

(lua_state *l

,int

index

);

作乙個等價於t[k]=v的操作,這裡t是乙個給定有效索引index處的值,v指棧頂的值,而k是棧頂之下的那個值。這個函式會把鍵和值都從堆疊彈出。和在lua中一樣,這個函式可能觸發「newindex」事件的元方法。

lua_pushcfunction

(lua_state *l

,lua_cfunction f

);

將乙個c函式壓入堆疊。這個函式接收乙個c函式指標,並將乙個型別為function的lua值壓入堆疊。當這個棧定的值被呼叫時,將觸發對應的c函式。

註冊到lua中的任何函式都必須遵循正確的協議來接收引數和返回值(參見lua_cfunction)。

lua_pushcfunction是作為乙個巨集定義出現的:

#define

lua_pushcfunction(l

,f)lua_pushcclosure(l

,f,0

)

int

lua_setmetatable

(lua_state *l

,int

index

);

把乙個table彈出堆疊,並將其設為給定索引處的值的metatable。

void

lua_pushcclosure

(lua_state *l

,lua_cfunction fn

,intn)

把乙個新的c closure壓入堆疊。

當建立了乙個c函式後,你可以給它關聯一些值,這樣就是在建立乙個c closure;接下來無論函式何時被呼叫,這些值都可以被這個函式訪問到。為了將一些值關聯到乙個c函式上,首先這些值需要先被壓入堆疊。引數n告知有多少個值需要關聯到函式上。lua_pushcclosure也會把這些值從棧上彈出。

void

*lua_newuserdata

(lua_state *l

,size_t

size

);

這個函式分配一塊指定大小的記憶體塊,把記憶體塊位址作為乙個完整的userdata壓入堆疊,並返回這個位址。

userdata代表lua中的c值。完整的userdata代表一塊記憶體。他是乙個物件(就像table那樣的物件):你必須建立它,它有著自己的元素表,而且它在被**時,可以被檢測到。乙個完整的userdata只和它自己相等(在等於的原生作用下)。

當lua通過gc元方法**乙個完整的userdata時,lua呼叫這個元方法並把userdata標記為已終止。等到這個userdata再次被收集的時候,lua會釋放掉相關的記憶體。

void

*lua_touserdata

(lua_state *l

,int

index

);

如果給定索引處的值是乙個完整的userdata,函式返回記憶體塊的位址。如果是乙個light userdata,那麼就返回它表示的指標。否則,返回null。

lua呼叫c++類要點:

1.為此類建立乙個全域性表,表名為類名tbclass;

lua_newtable

();int

methods

=lua_gettop(l

);lua_pushstring(l

,t::classname

);lua_pushvalue(l

,methods

);lua_settable(l

,lua_globalsindex

);

2.註冊乙個key為t::classname的metatable,並制定其中的一些成員,用於之後生成的userdata。

//這個表用於userdata(t的物件)的metatable

lual_newmetatable(l,t::classname);

int metatable=lua_gettop(l);

//metatable["__index"] = tbclass

lua_pushliteral(l,"__index");

//1lua_pushvalue(l,methods);

//2lua_settable(l,metatable);

//3lua_pushliteral(l,"__tostring");

///1

lua_puchcfunction(l,tostring_t);

///2

lua_settable(l,metatable);

///3

lua_pushliteral(l,"__gc");

1lua_pushcfunction(l,gc_t);

2lua_settable(l,metatable);

3

3.為此表指定成員,每個成員的key為類的成員函式名,value為乙個帶有閉包的統一函式。比如tbclass[funname]=thunk,之後可以根據閉包得到具體是呼叫到哪個函式。閉包中有函式名和相應函式的組合結構(以lightuserdata的形式賦給閉包)。這些類成員函式引數必須包括lua_state,因為它需要的引數都會在lua堆疊中。

//為tbclass填充成員函式

for(regtype *l=t::methods;l->name;l++)

4.建立c物件給指令碼使用b=account.new(account,30);new 是tbclass下的乙個函式(另外指定的,不會掉到thunk,這一句會呼叫到c的乙個函式,裡面會生成乙個c物件,然後建立乙個userdata用於關聯到這個新生成的c物件。最後為這個userdata繫結上我們上面註冊為t::classname的metatable。因為定製了metatable的__index成員,所以當userdata找不到的成員會去呼叫__index,因為之前我們把__index繫結到tbclass,所以也會呼叫到tbclass的相應成員。

//建立乙個新的t物件,並建立乙個基於userdatatype的userdata,其中保護了指向t物件的指標

static int new_t(lua_state *l)

5.當指令碼中個指定函式被呼叫的時候,比如b:deposit(50.30)的時候,b是userdata,它的metatable的__index和tbclass繫結,所以會呼叫到tbclass的相應成員,就是之前關聯的thunk:這個時候l的堆疊裡面有這個函式的兩個引數,乙個是b本身,乙個是50.30 。b是userdata,可以根據它取出物件的指標。另外函式被呼叫的時候,它相關的upvalue也可以取得到,有了物件指標和相應的函式,呼叫也不為難了,記住引數50.30是儲存在堆疊中傳給類的成員函式來取得

static

intthunk

(lua_state *l

)

Lua和C 的互動

step1 搭建好vs和lua相互動的環境 2.有lua lib.lib這個檔案 3.開始配置 滑鼠放在工程名那 右鍵選屬性 位址就選上面有原始碼的檔案路徑。如上,把引用目錄點開進行編輯位址是選lib檔案的位址 如上,吧庫目錄點開進行編輯位址也是lib檔案的位址 step2 給這個工程新增標頭檔案 ...

lua與C互動函式

在lua中,lua堆疊就是乙個struct,堆疊索引的方式是正數也可以是負數,區別是 正數索引1永遠表示棧低,負數索引 1永遠表示棧頂。棧頂 4 1 3 2 2 3 1 4 棧底lua gettop lua state l 返回棧頂索引 即棧長度 lua settop lua state l,int...

lua於c的互動函式

void lua newtable lua state l 建立乙個空 table 並將之壓入堆疊。它等價於lua createtable l,0,0 int lua gettop lua state l 返回棧頂元素的索引。因為索引是從 1 開始編號的,所以這個結果等於堆疊上的元素個數 因此返回 ...