您的位置:首页 > 编程语言 > Lua

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声明主函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: