• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

lua源代码学习(一)lua的capi外围实现

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

工作后,整个人已经比較松懈了。尽管一直在看lua的源代码。可是一直是比較零碎的时间,没有系统的整理,所以还是收获不多。由于近期工作也不是非常忙了,就想整理下lua的源代码学习的笔记。加深下印象,并分享给大家。

先说下这系列bolg我会每周更新2-3篇,没有顺序的

这些文章都是自己的浅薄的理解。有什么错误,还请各位拍砖赐教。

1.关于c语言函数的声明

相信大家都知道接口的重要,在lua中。假设要调用c语言的函数,就必需要有一个统一的函数声明:

typedef int (*lua_CFunction) (lua_State *L);

可是,我们非常多函数都不是这种声明。所以。我们就需要有一个包装函数:

比方cos函数:

在c语言,标准math库中,声明例如以下:

double cos (double);

经过包装后:

static int math_cos (lua_State *L) {
  lua_pushnumber(L, l_mathop(cos)(luaL_checknumber(L, 1)));
  return 1;
}

由于lua是一个状态机。全部的操作都是在操作栈。所以lua_CFunction中传入的lua_state这个栈,就能够获取lua执行中的全部数据了

luaL_checknumber(L,1):表示获取栈顶的number,而且调用标准c的cos函数,而且cos计算值又一次压栈。

2.关于luaL_Reg映射表

我们接口已经好了。那么我们在lua中怎么调用这些函数呢?

<pre name="code" class="html">typedef struct luaL_Reg {
  const char *name;
  lua_CFunction func;
} luaL_Reg;


lua为定义了这样一个结构体,name表示在lua中的函数名字,func表示name真正调用的函数

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;
}

luaL_newlib:这个函数一个宏:创建一个table来保存我们映射数据(key-value值)。




鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap