C 与 LUA -相互调用及值传递

写在最前

        由于工作需要,有幸正真地开始接触lua。

        lua一直是动态执行脚本中的宠儿,而究其原因不外乎简介方便,效率高。我甚至看到过有帖子说lua就是为了动态化c而生的,c是静态的,是编译型的,这使得他的灵活性大大下降,但是lua则弥补了他的短板。

        并且lua本身也是由c实现的,整个虚拟机十分轻量独立,天不生你lua哥,万古c界如长夜。

相关背景

        其实任何的程序与程序或代码段与代码段的交互只有两点,第一是调用,第二是数据的传递。因为程序的本质就是各种微小的子过程进行递归地聚合。最终成为一个能解决某种需求的应用程序体。

        而由于lua引擎本身就是由c代码实现的,且本身轻量化的特性,在一个c程序内可以自由地创建多个虚拟机实例,而整个调度运行过程也可以轻易控制,而在lua影响c的方面,lua引擎自身就提供了动态注册lua函数例程的功能。

正文开始

        Lua与c逻辑代码之间的值传递全部通过一个虚拟栈实现,该栈已经由引擎代码封装细节。我们只需要像正常操作c++的栈数据结构一样,进行一些push,get类似的操作即可设置和获取lua相关的值

 

        而栈上的每个位置的含义,是我们需要关注的重点:栈和汇编类似,按照数据声明或出现的顺序压栈,函数调用时也是从左到右压栈,符合认知常识。

        但对于栈位置的标记,lua使用-1代表栈顶,依次顺延。而采用1代表栈底。示例:

 

        在图中所示的时候,栈1和-8代表同一个位置,因此使用相关的函数取值或设值时参数传入1和-8是同一个值。

          实操代码:

--data.lua
length = 5
width = 10
heigth = 20

 有这样一段lua代码,由上文阐述可知。length 全局变量最先被放入栈,接着是width,最后是heigth 。因此lua虚拟栈情况为:

         此时下面两行代码都表示取height变量。

 luaL_checknumber(luaEnv, -1);
 luaL_checknumber(luaEnv, 3);

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值