lua的API

一:定义:

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学习总结)