lua与C交互关键函数

Posted 独立特行

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua与C交互关键函数相关的知识,希望对你有一定的参考价值。

1lua_next(L, t_idx)

参数解释:

L:虚拟机

t_idxtable在栈中索引

返回

int0执行失败;非0执行成功

该函数的执行流程为:

:先从栈顶弹出一个key

:从栈指定位置的table中取下一对key-value对,先将key入栈,再将value入栈;

:如果成功则返回非0值;否则返回0,并且不向栈中压入任何值;

说明:第步中从table里面取出"下一对key-value"值是相对于第步中弹出的key的,

table里面第一对key-value前面没有数据,所以先用lua_pushnil()压入一个nil值作为初始key

到了table中已经没有key-value时,不会向栈中插入新的key-value对,这时lua_next()返回0

循环结束;

C里面可以使用lua_gettable()lua_rawget()函数获取表中数据,但是你事先需知晓索引名称;

使用lua_next()的好处是,可以事先不知道这些信息;

----------------------------------------------------------------------------------------------------------

2lua_gettable(L, t_idx)

参数解释:

L:虚拟机

t_idxtable在栈中索引

函数执行流程为:

:取栈顶元素的值,以该值作为key,到t_idx指定的table中去取对应的value

:弹出key,并压入取到的value


----------------------------------------------------------------------------------------------------------

3lua_getglobal(L, key)

参数

L:虚拟机

key:宿主程序想要获取的变量的名称

返回

void

执行流程:

:宿主会将名称key置于栈的顶部,此时栈包含一个元素;

lua取得这个key后,清除栈中这个key(此时栈顶不包含元素),并到lua的全局表中查找这个key对应的value

:若全局表找到对应的value,将这个值压入栈顶(宿主程序可以取用);若全局表未找到,压入nil

----------------------------------------------------------------------------------------------------------

3lua_setglobal(L, key)

参数

L:虚拟机

key:宿主程序想要获取的变量的名称

返回

void

执行流程:

:宿主会将名称key置于栈的顶部

lua取得这个key后,作为一个全局变量名,并到lua的全局表中查找这个key对应的value

:若全局表找到对应的value,将这个值压入栈顶(宿主程序可以取用);若全局表未找到,压入nil

----------------------------------------------------------------------------------------------------------

4lua_settop(L, idx)

参数解释

L:虚拟机

idx:将栈指针移动到指定的索引位置,例如lua_settop(L, 0)常用来重置栈,这样我们入栈的第一个信息就在idx=1的位置了

-----------------------------------------------------------------------------------------------------------

5lua_setfield(L, t_idx, key)

参数解释:

L:虚拟机

t_idx:表在L栈中的索引

key:待设置键名称

返回:

void

执行细节:

:取栈顶val

:根据t_idx的值,找到对应的表t,做 t[key]=val的操作;

:弹出栈顶val

------------------------------------------------------------------------------------------------------------

6lua_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:虚拟机

narrTable中数组部分预分配元素数量

nrecTable中哈希部分预分配元素数量

返回:

void

执行细节:

:创建一个table,数组部分预分配narr个元素,哈希部分预分配nrec个元素

:将table压入栈顶

------------------------------------------------------------------------------------------------------------

9??luaL_setfuncs(L, narr, nrec)

参数解释:

L:虚拟机

narrTable中数组部分预分配元素数量

nrecTable中哈希部分预分配元素数量

返回:

void

执行细节:

:创建一个table,数组部分预分配narr个元素,哈希部分预分配nrec个元素

:将table压入栈顶

------------------------------------------------------------------------------------------------------------

?

10??lua_pushcclosure(lua_State *L, lua_CFunction fn, int n)

?

参数解释:

L:虚拟机

fnc函数

nc函数关联的upvalues个数

返回:

void

执行细节:

:创建和压入一个C闭包到栈顶

:关联nupvalues到这个C闭包,首先这些upvalue必须被压入栈中

:该函数调用结束后会弹出上面入栈的upvalue值,闭包不会被弹出;

------------------------------------------------------------------------------------------------------------

11??luaL_setfuncs(L, narr, nrec)

参数解释:

L:虚拟机

narrTable中数组部分预分配元素数量

nrecTable中哈希部分预分配元素数量

返回:

void

执行细节:

:创建一个table,数组部分预分配narr个元素,哈希部分预分配nrec个元素

:将table压入栈顶

------------------------------------------------------------------------------------------------------------

以上是关于lua与C交互关键函数的主要内容,如果未能解决你的问题,请参考以下文章

搭建Lua与C/C++交互的环境

搭建Lua与C/C++交互的环境

02 Lua 基本语法

LuaJavaBridge - lua与java互操作的简单解决方案

Lua与C/C++交互——C/C++调用Lua脚本

Lua与C/C++交互