lua与c交互

###Lua_State 动态结构
这个结构是虚拟机运行起来最重要的结构体

用 Lual_newstate 创建一个新的环境
lualib.h 定义了打开标准库的函数 Lual_openlibs 可以打开所有的标准库
创建好状态 在加载了标准库以后就能解释用户的输入了。

Lua 和 c 的交互全在虚拟站里面进行。
虚拟栈解决了lia和c 的两大差异
1>lua的垃圾收集
2>c是静态类型 lua是动态类型。

lua_loadbuffer() 函数来编译用户输入的每行内容 没有错误 返回0 并向栈中压入编译好的程序块。
调用lua_pcall 将程序块从栈中弹出。在保护模式中运行。返回0无错误。出错会像虚拟站里面压入错误信息。
lua_pop可以将站里的信息删除。lua_tostring获得这条信息。。

如果将lua作为c来编译 并在c++中使用,可以包含 lua.hpp 代替lua.h
lua.hpp定义 :
extern “c”{#include “lua.h”}
###c包含lua类型
lua的函数参数是没有类型的 c是要固定类型的 这个可以用union来解决
声明一个 union 里面装着 所有的lua类型
例如:settable(lua_value a,lua_value k, lua_value v);     //a 是表名 k是键值 v是实值
这样有两个缺点 :
1>不能将这样的东西 映射到其他的语言
2>lua的垃圾清理机制 如果用c的这个保存变量 lua的垃圾清理检测不到 然后把他们当成垃圾了,然后给清理了就好了。

所以 并没有用这样的方式实现, 而是使用了一种特殊的虚拟站 实现。
栈里面的每一个元素都能保存任何类型的lua值。要获取lua值的时候就调用一个lua 的 API函数。

lua将指定的值压入栈中。将一个值传给lua时候,先将值压入栈。然后调用lua API lua就可以获得值 并从栈中弹出
为了将c类型的值压入栈,或者从栈中获取不同类型的值,就为每个类型定义一个特定的函数。栈有lua管理 可以共垃圾收集器使用。
lua_loadbuffer将编译好的程序块或者错误信息留在栈中。

lua_pcall会调用栈中的一个函数

lua 按照LIFO规范来操作栈,当调用lua时候,lua只会改变栈顶。

c代码拥有更大的自由度,比如插入删除遍历等等。

压入栈函数 API
lua_pushnil(lua_state *L);                  //压入nil

lua_pushboolean(lua_state *L,int bool);           //压入bool

lua_pushnumer(lua_state *L,lua_Number n);         //压入双精度

lua_pushinteger(lua_state *L,lua_Integeter);         //压入整数

lua_pushlstring(lua_state L,const char str,size_t len);    //压入定长字符串

lua_pushstring(lua_state *L,const char *str);         //压入结尾是0的字符串

lua_Number lua_Integer是lua的两个类型 吧 对应小数整数

lua会为字符串创建副本而不会持有指针 所以放心操作。

lua_checkStack(lua_state *L,int sz)     //检测是否有足够的空闲。 4 - 2 80 - 40 240 -120 -3
###错误处理

平常代码是 在不保护模式下进行的

当乱发现了例如"内存不足"这样的错误的时候,不会处理,而是调用一个“紧急”函数,打不过嘎不是关于发布关于三皈依,lua就结束了,可以通过lua_aparic设置自己的"紧急"函数。

lual_newstate,lua_load,lua_pcall,lua_close是安全的,不会跑出异常。

如果发生了内存的错误 又不想结束程序

1>设置一个"紧急”函数,不把控制权返回给lua

2>让代码在“保护模式”下运行

大多数采用2 的做法 独爱踢不过lua_pcall来运行lua代码 这些lua代码就是运行在保护模式下的。

在为lua 编写函数的时候 只有一种标准的错误处理方法。当c函数检测到一个错误时候 就用该调用lua_error .lua_error会清理lua中所有要清理的东西,然后跳到之前要执行的Lua_pcall,并附上一条错误信息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值