【lua学习】Lua中调用C函数
Lua利用一个虚拟的堆栈来给C传递值或从C获取值。每当Lua调用C函数,都会获得一个新的堆栈,该堆栈初始包含所有的调用C函数所需要的参数值(Lua传给C函数的调用实参),并且C函数执行完毕后,会把返回值压入这个栈(Lua从中拿到C函数调用结果)。
于此相关的C API有几个比较重要的定义如下:
(1)typedef struct lua_State lua_State;
lua虚拟机(或叫解释器),可以理解为一个thread,和一个完整的Lua虚拟环境的执行状态。
(2)typedef int (*lua_CFunction) (lua_State *L);
能够被Lua调用的C函数都必须是这种规则。函数的返回的int值表示C函数返回值的个数。
(3)void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);
将一个C闭包压栈;
首先将upvalues依次压栈,然后调用该函数,将c函数压栈,并将n个upvalues出栈;
参数fn:C函数指针
参数n:函数关联的upvalue的个数。
(4)void lua_pushcfunction (lua_State *L, lua_CFunction f);
将C函数压栈;
接收一个C函数的指针参数,然后将一个Lua.function类型的对象压栈。
(5)void lua_register (lua_State *L, const char *name, lua_CFunction f);
注册C函数为一个全局变量;
#define lua_register(L,n,f) (lua_pushcfunction(L, f), lua_setglobal(L, n))
(