代码就不贴了,这里只是梳理一下前两篇里面忽略的一些东西,作为读代码的记录吧。

1、头文件

#include <lauxlib.h>
#include <lua.h>

All API functions and related types and constants are declared in the header file “lua.h”。

The auxiliary library provides several convenient functions to interface C with Lua. While the basic API provides the primitive functions for all interactions between C and Lua, the auxiliary library provides higher-level functions for some common tasks. All functions from the auxiliary library are defined in header file lauxlib.h and have a prefix luaL_.

2、void *lua_newuserdata (lua_State *L, size_t size)。

首先我们需要知道一下什么叫userdata?额,我的理解,C里面的所有数据类型,在lua中只有一个名字userdata。事实上,这里只是一块内存而已。如果还记得lightuserdata的话,也应该记得,这个是一个指针。

lua_newuserdata这个调用是申请了一块大小为size的内存,然后返回指向这块userdata的一个指针(void型),指针指向这块空间首地址;同时往堆上push一个userdata类型element。

lua并不能理解userdata,不能对其内容进行运算等操作。所以,使用userdata,我们还需要添加相关的操作方法,另外,new出来的userdata,还需要给他添加gc元方法供lua收回释放。

至于什么时候userdata会被gc收回。。。唔,我找了半天没明确答案,或是可信答案,也暂时不想翻代码,不过有人说是这样的:gc假设所有的userdata都是需要结束的,然后开始找它指向的根对象是否有效(至于怎么个有效法暂时未知),如果无效则回收userdata的空间。

追了一下这里的调用情形:

1)我们在L中new出来一个size为指针类型的空间,它的值是dll返回来的一个地址,由指针p带回来这个地址;如此,在堆顶有一个userdata类型的element。这里不需要我们再pushinteger到lua。

2)给这个element设置metatable。

3)metatable.__gc()中是通过调用dll里操作来实现的。直接调用dll里面的方法,free(p)。如此就完成了这个gc。

3、int luaL_optint (lua_State *L, int narg, int d)

检查narg,如果是一个number,那么返回一个int类型的数;如果是nil,或者是没有,那么返回参数d。没想明白这个是用来干嘛的,待了解。

4、没有4了居然,好吧,草草的把这个wrapper看了一遍。

luars232库中用到的一些C API for lua的更多相关文章

  1. ⏰Day.js 2kB超轻量时间库 和Moment.js一样的API

    Moment.js 是一个大而全的 JS 时间库,很大地方便了我们处理日期和时间.但是 Moment.js太重了(200k+ with locals),可能一般项目也只使用到了她几个常用的API.虽然 ...

  2. HttpLuaModule——翻译(Nginx API for Lua) (转)

    现在我已经将翻译的内容放到:http://wiki.nginx.org/HttpLuaModuleZh Nginx API for Lua Introduction 各种各样的*_by_lua和*_b ...

  3. HttpLuaModule——翻译(Nginx API for Lua)

    现在我已经将翻译的内容放到:http://wiki.nginx.org/HttpLuaModuleZh Nginx API for Lua Introduction 各种各样的*_by_lua和*_b ...

  4. 导出 C/C++ API 给 Lua 使用[转]

    导出 C/C++ API 给 Lua 使用   cocos2d-x 和 quick-cocos2d-x 的底层代码都是使用 C++ 语言开发的.为了使用 Lua 脚本语言进行开发,我们利用 tolua ...

  5. openresty HTTP status constants nginx api for lua

    https://github.com/openresty/lua-nginx-module context: init_by_lua, set_by_lua, rewrite_by_lua, acce ...

  6. 从语言到库到框架,再到API,再到标记最后到DSL语言

    计算机技术发展很快,而且越来越快,结果也是越来越复杂,那么我们到底怎么搞定复杂性并重用代码? 很明显,这是个大难题.一开始我们要解决计算问题,发展了基本的编程语言. 很快,编程语言不能满足需求,我们需 ...

  7. Requests库的几种请求 - 通过API操作Github

    本文内容来源:https://www.dataquest.io/mission/117/working-with-apis 本文的数据来源:https://en.wikipedia.org/wiki/ ...

  8. 关于Merge的整理--AndroidScreenSlidePager开源库中用到的

    在做AndroidScreenSlidePager开源库练习demo的时候,发现布局文件使用的是<merge>标签而不是<FrameLayout>标签.作者给出的说法是:Cir ...

  9. Day.js 是一个仅 2kb 大小的轻量级 JavaScript 时间日期处理库,和 Moment.js 的 API 设计保持完全一样,dayjs

    https://gitee.com/mirrors/Day.js api: https://gitee.com/mirrors/Day.js/blob/master/docs/zh-cn/API-re ...

随机推荐

  1. warning: #870-D: invalid multibyte character sequence

    warning: #870-D: invalid multibyte character sequence2011-03-12 9:18warning: #870-D: invalid multiby ...

  2. [MCSM] Slice Sampler

    1. 引言 之前介绍的MCMC算法都具有一般性和通用性(这里指Metropolis-Hasting 算法),但也存在一些特殊的依赖于仿真分布特征的MCMC方法.在介绍这一类算法(指Gibbs samp ...

  3. 你能熟练使用Dictionary字典和List列表吗?(转)

    命名空间System.Collections.Generic中有两个非常重要,而且常用的泛型集合类,它们分别是Dictionary<TKey,TValue>字典和List<T> ...

  4. centos hadoop搭建准备

    永久修改主机名:hostnamectl set-hostname <hostname> IP地址: BOOTPROTO=static IPADDR=192.168.31.128NETMAS ...

  5. c/s 自动升级(WebService)

    首先声明,本人文笔不好,大家见笑,欢迎高手吐槽. 做c/s开发肯定会遇到的就是自动升级功能,而这实现方式是非常多. 本文使用 webservice的方式来提供升级服务 首先准备服务 为了方便我们专门用 ...

  6. 利用PhotoShop将Font-Awesome转为图片格式

    介绍如何将Font-Awesome等字体图标转换为图片格式,使用PHOTPSHOP很简单. 网上找了很多,都比较麻烦.别问为什么要这么做,因为你还没遇到需要的时候. 下载Font-Awesome字体库 ...

  7. 来个linq to js

    说这个话题之前,我们来讲一下C#的linq  语法.在C#里面我们会对列表进行操作,如OrderBy(p=>p.property),Where(p=>p.property==..) 括号里 ...

  8. java中的注解

    注解为程序提供信息,但不是程序本身的组成部分.注解有以下用途: * 为编译器提供信息,相当于C语言中的预编译指令 * 部署时处理,软件工具可以根据注解来生成代码,XML文件等,例如编写servlet, ...

  9. js 漩涡

    What's the ball's orbit if they head for it's next ball. <html> <canvas id="ca"&g ...

  10. ubuntu搭建java开发环境

    最近因为要编译Android源码,但是报错因为Java版本低于1.7.x而不能进行编译,于是进行Java版本更改. 安装前软件环境: Ubuntu14.02,Java 1.6.0_29 目标软件环境: ...