关于Lua与C数据通信的栈深入认识
发布时间:2021-11-20 15:01:31 所属栏目:教程 来源:互联网
导读:Lua栈概述 我们知道Lua是一种嵌入式语言,所有的Lua程序最后都需要通过Lua解释器(即Lua虚拟机)把其解析成字节码的形式才能执行。 一方面,我们可以在一个应用程序(拥有主动权)中嵌入Lua解释器,此时使用Lua的目的是方便扩展这个应用程序,用Lua实现相应
Lua栈概述 我们知道Lua是一种嵌入式语言,所有的Lua程序最后都需要通过Lua解释器(即Lua虚拟机)把其解析成字节码的形式才能执行。 一方面,我们可以在一个应用程序(拥有主动权)中嵌入Lua解释器,此时使用Lua的目的是方便扩展这个应用程序,用Lua实现相应的工作;另一方面,我们在Lua程序(此时用Lua语言编写的程序拥有主动权)中也可以使用那些用C语言实现的函数(比如string.find())。 在上面两个描述中,都涉及到Lua与C之间数据交换,而在这两种语言交换数据时,我们自然面临两个问题,一个是Lua是动态类型语言,在Lua语言中没有类型定义的语法,每个值都携带了它自身的类型信息,而C语言是静态类型语言;另一个是Lua使用垃圾收集,可以自动管理内存,而C语言要求程序自己释放分配的内存,需应用程序自身管理内存。为了解决这个两个问题,Lua引入了一个虚拟栈。 为了方便Lua与C交互,比如在C代码中调用Lua函数,Lua官方提供了一系列的API和库。利用这些API,C语言就可以方便从Lua中获取相应的值,也可以方便地把值返回给Lua,当然,这些操作都是通过栈作为桥梁来实现的。 访问Lua栈的API -------------------------------------------------------------------------------- Lua提供了大量的API用于操作栈,这些API方便我们向栈中压入元素、查询栈中的元素、修改栈的大小等操作。下面对常用的API使用做一个简单总结,尤其在使用这些API的需要注意的地方。 1、向栈中压入元素 向栈中压入元素的API,通常都是以lua_push*开头来命名,比如lua_pushnunber、lua_pushstring、lua_pushcfunction、lua_pushcclousre等函数都是向栈顶中压入一个Lua值。通常在Lua代码中调用C实现的函数并且被调用的C函数有返回值时,被调用的C函数通常就要用到这些接口,把返回值压入栈中,返回给Lua(当然这些C函数也要求返回一个值,告诉Lua一共返回(压入)了多少个值)。值得注意的是,向栈中压入一个元素时,应该确保栈中具有足够的空间,可以调用lua_checkstack来检测是否有足够的空间。 实质上这些API是把C语言里面的值封装成Lua类型的值压入栈中的,对于那些需要垃圾回收的元素,在压入栈时,都会在Lua(也就是Lua虚拟机中)生成一个副本。比如lua_pushstring(lua_State *L, const char *s)会向中栈压入由s指向的以' |