lua於c的互動函式

2021-06-07 00:28:06 字數 4905 閱讀 3424

void lua_newtable (lua_state *l);
建立乙個空 table ,並將之壓入堆疊。 它等價於lua_createtable(l, 0, 0)

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

lual_newmetatable

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);
checks whether the function argumentnargis a userdata of the typetname(seelual_newmetatable).

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

void lua_pushlstring (lua_state *l, const char *s, size_t len);
把指標s指向的長度為len的字串壓棧。 lua 對這個字串做一次記憶體拷貝(或是復用乙個拷貝), 因此s處的內存在函式返回後,可以釋放掉或是重用於其它用途。 字串內可以儲存有零字元。

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" 事件的元方法 (參見 §2.8)。

void 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, int n);
把乙個新的 c closure 壓入堆疊。

當建立了乙個 c 函式後,你可以給它關聯一些值,這樣就是在建立乙個 c closure (參見 §3.4); 接下來無論函式何時被呼叫,這些值都可以被這個函式訪問到。 為了將一些值關聯到乙個 c 函式上, 首先這些值需要先被壓入堆疊(如果有多個值,第乙個先壓)。 接下來呼叫lua_pushcclosure來建立出 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 會釋放掉相關的記憶體。

lua_touserdata

void *lua_touserdata (lua_state *l, int index);

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

null。

lua呼叫c++類要點:

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

lua_newtable

(l);

intmethods = 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);

intmetatable = lua_gettop(l);

// metatable["__index"] = tbclass

lua_pushliteral(l, "__index");

lua_pushvalue(l, methods);

lua_settable(l, metatable);

// metatable["__tostring"] = tostring_t

lua_pushliteral(l, "__tostring");

lua_pushcfunction(l, tostring_t);

lua_settable(l, metatable);

// metatable["__gc"] = gc_t

lua_pushliteral(l, "__gc");

lua_pushcfunction(l, gc_t);

lua_settable(l, metatable);

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

intnew_t(lua_state *l)

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

// 所有成員函式都會呼叫到這裡,然後根據upvalue來執行具體的成員函式

static

intthunk(lua_state *l)

// 根據指定位置narg獲得物件指標,這個userdata是在new_t的時候建立的

static

t *check(lua_state *l, int

narg)

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 等價於 lua createtable l 0,0 建立乙個空table,並將之壓入堆疊。int lua gettop lua state l 返回棧頂元素的索引。因為索引是從1開始編號的,所以這個結果等於堆疊上的元素編號 因此返回0表示堆...

Lua和C 的互動

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