zoukankan      html  css  js  c++  java
  • lua源代码学习(一)lua的c api外围实现

    工作后,整个人已经比較松懈了。尽管一直在看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值)。



  • 相关阅读:
    VB.NET中对象的克隆 利用了内存流内象和序列化
    关于对象组件编写的一点想法
    虽然有人说什么和平第一, 经济第一, 可是我怎么能不因为愤怒而发抖?
    用C# 调用MS speech引擎, 让电脑读文本, 或是存到WAV文件里去.
    抽空看了一下 dockpanel suite, 知道如何用了, 立此存照
    dn081A
    如何列出某类型的所有成员
    上周买了毛爷爷传
    【转载】MySQL双主双从高可用集群架构
    【转载】MySQL和Keepalived高可用双主复制
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/9924658.html
Copyright © 2011-2022 走看看