lua與C交互關鍵函數
1、lua_next(L, t_idx)
參數解釋:
L:虛擬機
t_idx:table在棧中索引
返回
int:0執行失敗;非0執行成功
該函數的執行流程為:
①:先從棧頂彈出一個key;
②:從棧指定位置的table中取下一對key-value對,先將key入棧,再將value入棧;
③:如果②成功則返回非0值;否則返回0,並且不向棧中壓入任何值;
說明:第②步中從table裏面取出"下一對key-value"值是相對於第①步中彈出的key的,
table裏面第一對key-value前面沒有數據,所以先用lua_pushnil()
到了table中已經沒有key-value時,不會向棧中插入新的key-value對,這時lua_next()返回0,
循環結束;
在C裏面可以使用lua_gettable()或lua_rawget()函數獲取表中數據,但是你事先需知曉索引名稱;
使用lua_next()的好處是,可以事先不知道這些信息;
----------------------------------------------------------------------------------------------------------
2、
參數解釋:
L:虛擬機
t_idx:table在棧中索引
函數執行流程為:
①:取棧頂元素的值,以該值作為key,到t_idx指定的table中去取對應的value
②:彈出key,並壓入取到的value
----------------------------------------------------------------------------------------------------------
3、lua_getglobal(L, key)
參數
L:虛擬機
key:宿主程序想要獲取的變量的名稱
返回
void
執行流程:
①:宿主會將名稱key置於棧的頂部,此時棧包含一個元素;
②:lua取得這個key後,清除棧中這個key(此時棧頂不包含元素),並到lua的全局表中查找這個key對應的value
③:若全局表找到對應的value,將這個值壓入棧頂(宿主程序可以取用);若全局表未找到,壓入nil
----------------------------------------------------------------------------------------------------------
3、lua_setglobal(L, key)
參數
L:虛擬機
key:宿主程序想要獲取的變量的名稱
返回
void
執行流程:
①:宿主會將名稱key置於棧的頂部
②:lua取得這個key後,作為一個全局變量名,並到lua的全局表中查找這個key對應的value
③:若全局表找到對應的value,將這個值壓入棧頂(宿主程序可以取用);若全局表未找到,壓入nil
----------------------------------------------------------------------------------------------------------
4、lua_settop(L, idx)
參數解釋
L:虛擬機
idx:將棧指針移動到指定的索引位置,例如lua_settop(L, 0)常用來重置棧,這樣我們入棧的第一個信息就在idx=1的位置了
-----------------------------------------------------------------------------------------------------------
5、lua_setfield(L, t_idx, key)
參數解釋:
L:虛擬機
t_idx:表在L棧中的索引
key:待設置鍵名稱
返回:
void
執行細節:
①:取棧頂val;
②:根據t_idx的值,找到對應的表t,做 t[key]=val的操作;
③:彈出棧頂val
------------------------------------------------------------------------------------------------------------
6、lua_getfield(L, t_idx, key)
參數解釋:
L:虛擬機
t_idx:表在L棧中的索引
key:待取值的鍵名稱
返回:
void
執行細節:
①:根據t_idx的值,找到對應的表t,取 val = t[key]
②:將val壓入棧頂
------------------------------------------------------------------------------------------------------------
7、?luaL_Reg
解釋:
typedef struct luaL_Reg {
? const char *name; ?// lua中函數的名稱
? lua_CFunction func; ?// 指向C中函數的函數指針
} luaL_Reg;
一個數組的類型,該數組會包含一些函數,這些函數會通過?luaL_setfuncs?()函數被註冊,
每一個luaL_Reg數組都必須用{NULL, NULL}來作為結尾的元素;
------------------------------------------------------------------------------------------------------------
8、?lua_createtable(L, narr, nrec)
參數解釋:
L:虛擬機
narr:Table中數組部分預分配元素數量
nrec:Table中哈希部分預分配元素數量
返回:
void
執行細節:
①:創建一個table,數組部分預分配narr個元素,哈希部分預分配nrec個元素
②:將table壓入棧頂
------------------------------------------------------------------------------------------------------------
9、??luaL_setfuncs(L, narr, nrec)
參數解釋:
L:虛擬機
narr:Table中數組部分預分配元素數量
nrec:Table中哈希部分預分配元素數量
返回:
void
執行細節:
①:創建一個table,數組部分預分配narr個元素,哈希部分預分配nrec個元素
②:將table壓入棧頂
------------------------------------------------------------------------------------------------------------
?
10、??lua_pushcclosure(lua_State *L, lua_CFunction fn, int n)
?
參數解釋:
L:虛擬機
fn:c函數
n:與c函數關聯的upvalues個數
返回:
void
執行細節:
①:創建和壓入一個C閉包到棧頂
②:關聯n個upvalues到這個C閉包,首先這些upvalue必須被壓入棧中
③:該函數調用結束後會彈出上面入棧的upvalue值,閉包不會被彈出;
------------------------------------------------------------------------------------------------------------
11、??luaL_setfuncs(L, narr, nrec)
參數解釋:
L:虛擬機
narr:Table中數組部分預分配元素數量
nrec:Table中哈希部分預分配元素數量
返回:
void
執行細節:
①:創建一個table,數組部分預分配narr個元素,哈希部分預分配nrec個元素
②:將table壓入棧頂
------------------------------------------------------------------------------------------------------------
lua與C交互關鍵函數