lua的API
2015-07-20 16:06
375 查看
一:定义:
C API是一个C代码与Lua进行交互的函数集。他有以下部分组成:读写Lua全局变量的函数,调用Lua函数的函数,运行Lua代码片断的函数,注册C函数然后可以在Lua中被调用的函数,等等。
二:堆栈解析
1. 理解lua的栈到底是什么?lua的栈类似于以下的定义, 它是在创建lua_State的时候创建的
TValue stack[max_stack_len] // 欲知内情可以查 lstate.c 的stack_init函数
lua的栈中压入的类型有数值,字符串,表,闭包。但是最后都是统一用TValue这种数据结构来保存的:
struct TValue { Value value; //存储的值 int tt; //存储的类型 }; union Value { GCObject *gcc; //诸如table, thread, closure, string需要内存管理垃圾回收的类型都存在这里 void *p; // 可以存一个指针, 实际上是lua中的light userdata结构 lua_Number n; //所有的数值存在这里, 不过是int , 还是float int b; // Boolean值存在这里, 注意, b只存布尔 }; union GCObject { GCheader gch; union TString ts; union Udata u; union Closure cl; struct Table h; struct Proto p; struct UpVal uv; struct lua_State th; };由上可知:
1. lua中, number, boolean, nil, light userdata四种类型的值是直接存在栈上元素里的, 和垃圾回收无关.
2. lua中, string, table, closure, userdata, thread存在栈上元素里的只是指针, 他们都会在生命周期结
束后被垃圾回收
三:c 调用lua
1.首先需要创建一个调用环境,即创建一个新栈lua_State,新的环境中并没有包含预定义函数,为了保持苗条所有
的标准库都已单独的包提供,可以通过调用一系列的luaopen_* 来打开这些库;
2.将需要调用的lua数据(或函数) 加载到栈中 lua_getglobal(lus_State, const char* name)然后按照该函数的
参数顺序依次将相应的参数lua_push* 到栈中。
3.调用lua_pcall(lua_State *L, int nargs, int nresults, int errfunc)等函数执行 结果将被压入栈中
四。lua调用C
一:注册单个函数
1.创建一个lua调用栈lua_State
2.定义需要调用的C函数类型必须为
typedef int (*lua_CFunction) (lua_State *L);而且需要时静态的static
3.将其注册到lua调用栈中lua_pushcfunction(lua_State *L, lua_CFunction f),用lua_setglobal为函数在lua中
定义一个名字;
4.lua中现在可以调用相应的函数了
二:注册函数库
1.定义库函数类型必须为
typedef int (*lua_CFunction) (lua_State *L);而且需要时静态的static
2.声明一个数组 这个数组的元素类型为luaL_Reg 数组最后一行必须是{NULL,NULL}
3.使用luaL_openlib声明主函数
相关文章推荐
- [转]LUA 学习笔记
- LuaBridge
- 将Lua嵌入IOS程序
- LUA 配置 运行 异常的备忘录
- Algorithms—150.Evaluate Reverse Polish Notation
- c++ lua文章list
- c++ lua文章list
- Lua 5.1 参考手册
- Lua 5.1 参考手册
- lua——基础语法
- Lua_绑定tinyxml到Lua中解析XML
- Lua_获取文件扩展名
- Order of evaluation
- Lua语言中字符串String实现原理
- Lua模拟类,继承,私密
- lua处理PHP序列化过后的数据为table
- 【Lua正则表达式】解析匹配优酷电视剧集的下载地址用来批量下载
- lua实现类的继承
- lua面向对象编程中冒号与点号的区别
- Codeforces Round #276 (Div. 2) B. Valuable Resources 二分