lua源码学习(一)lua的c api外围实现
2020-12-13 03:42
标签:lua 源码 工作后,整个人已经比较松懈了。虽然一直在看lua的源码,但是一直是比较零碎的时间,没有系统的整理,所以还是收获不多。因为最近工作也不是很忙了,就想整理下lua的源码学习的笔记,加深下印象,并分享给大家。 先说下这系列bolg我会每周更新2-3篇,没有顺序的 这些文章都是自己的浅薄的理解,有什么错误,还请各位拍砖赐教。 相信大家都知道接口的重要,在lua中,如果要调用c语言的函数,就必须要有一个统一的函数声明: typedef int (*lua_CFunction) (lua_State *L); 但是,我们很多函数都不是这样的声明,所以,我们就需要有一个包装函数: 比如cos函数: 在c语言,标准math库中,声明如下:
经过包装后: 因为lua是一个状态机,所有的操作都是在操作栈,所以lua_CFunction中传入的lua_state这个栈,就可以获取lua运行中的所有数据了 luaL_checknumber(L,1):表示获取栈顶的number,并且调用标准c的cos函数,并且cos计算值重新压栈。 我们接口已经好了,那么我们在lua中怎么调用这些函数呢? lua为定义了这样一个结构体,name表示在lua中的函数名字,func表示name真正调用的函数 当我们映射表好了后,要怎样注册? 现在比较详细的说下: luaL_newlib:这个函数一个宏:创建一个table来保存我们映射数据(key-value值)。 lua源码学习(一)lua的c api外围实现,搜素材,soscw.com lua源码学习(一)lua的c api外围实现 标签:lua 源码 原文地址:http://blog.csdn.net/yanglovefeng/article/details/359874171.关于c语言函数的声明
double cos (double);
static int math_cos (lua_State *L) {
lua_pushnumber(L, l_mathop(cos)(luaL_checknumber(L, 1)));
return 1;
}
2.关于luaL_Reg映射表
typedef struct luaL_Reg {
const char *name;
lua_CFunction func;
} luaL_Reg;
3.简短的说下luaopen_math函数调用过程
LUAMOD_API int luaopen_math (lua_State *L) {
luaL_newlib(L, mathlib);
lua_pushnumber(L, PI);
lua_setfield(L, -2, "pi");
lua_pushnumber(L, HUGE_VAL);
lua_setfield(L, -2, "huge");
return 1;
}