http://blog.codingnow.com/2015/05/lua_c_api.html

http://blog.csdn.net/oilcode/article/details/51086147

https://www.lua.org/manual/5.3/

https://cloudwu.github.io/lua53doc/manual.html

关于异常处理

1. 如果要在C++工程中使用Lua库,需要用C++的编译器来编译Lua库,这会促使编译后的Lua库使用try...catch的方式来捕获异常。随后,当通过Lua调用C++函数的时候,如果该C++函数抛出了一个异常,Lua虚拟机就会正常的捕获这个异常。如果一个使用C语言编译器编译的Lua库被使用到了一个C++工程中,该Lua库会使用setjmp/longjmp的机制来处理异常,那么C++抛出的异常就不会被Lua虚拟机捕获。

2. 不能在C++中用try...catch来捕获Lua C API抛出的异常,因为Lua虚拟机需要通过捕获这个异常来进行异常处理,如果C++捕获了该异常将破坏Lua虚拟机后续的执行。C++应该使用lua_pcalll来处理异常。

3. 如果C++中调用的一个Lua C API抛出了异常,那么该异常语句之后的所有调用都不会执行。

Lua 5.3 Reference Manual

4.8 – Functions and Types

Here we list all functions and types from the C API in alphabetical order. Each function has an indicator like this: [-o, +p, x]

The first field, o, is how many elements the function pops from the stack. The second field, p, is how many elements the function pushes onto the stack. (Any function always pushes its results after popping its arguments.) A field in the form x|y means the function can push (or pop) x or y elements, depending on the situation; an interrogation mark '?' means that we cannot know how many elements the function pops/pushes by looking only at its arguments (e.g., they may depend on what is on the stack). The third field, x, tells whether the function may raise errors: '-' means the function never raises any error; 'm' means the function may raise out-of-memory errors and errors running a __gc metamethod; 'e' means the function may raise any errors (it can run arbitrary Lua code, either directly or through metamethods); 'v' means the function may raise an error on purpose.

lua_pcall

1. 不会抛出异常

2. 总是会从栈顶删除函数及参数

luaL_openlibs的实现 

LUALIB_API void luaL_openlibs (lua_State *L) {
  const luaL_Reg *lib;
  /* "require" functions from 'loadedlibs' and set results to global table */
  for (lib = loadedlibs; lib->func; lib++) {
    luaL_requiref(L, lib->name, lib->func, );
    lua_pop(L, ); /* remove lib */
  }
}

对象的成员变量靠构造函数定义,这样所有的成员变量都在对象中

方法在 metatable中

继承体系靠为__index赋值一个table实现

点号和冒号的区别

点号相当于在表里找一个键对应的值。冒号应用在成员函数调用,也就是相当于先找到键对应的值,这个Value应该是一个function类型的值,然后在调用该函数的时候,将冒号前面的表当做第一个参数传入函数。

元方法不适用冒号的调用方法。元方法会自动将表作为第一个参数传入。

注册表

注册表是一个Lua预定义在伪索引LUA_REGISTRYINDEX处的一个表。这个表用来存储C代码中需要存储的值。只有C能访问能访问这个表。这个表中所使用的键和普通的表略有不同。通常用户需要使用字符串来作为键(通常用作metatable的名字;以下划线开头的名字是Lua保留的),而整数键被用来实现引用机制(luaL_ref)不能移作他用。

LUA_RIDX_GLOBALS
LUA_RIDX_MAINTHREAD

是两个注册表中预定义的特殊索引。

Lua C API的正确用法的更多相关文章

  1. VC和VS调用Lua设置以及Lua C API使用。

    通过c++调用lua 脚本,    环境VC++6.0    lua  sdk 5.1.4 在调用前先认识几个函数.1.调用lua_open()将创建一个指向Lua解释器的指针.2. luaL_ope ...

  2. C#中dynamic的正确用法

    C#中dynamic的正确用法  http://www.cnblogs.com/qiuweiguo/archive/2011/08/03/2125982.html dynamic是FrameWork4 ...

  3. 转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解

    Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解   多线程c语言linuxsemaphore条件变量 (本文的读者定位是了解Pthread常用多线程API和Pthread互斥锁 ...

  4. C#中dynamic的正确用法 以及 typeof(DynamicSample).GetMethod("Add");

    dynamic是FrameWork4.0的新特性.dynamic的出现让C#具有了弱语言类型的特性.编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性.比如,即使你 ...

  5. C#中dynamic、ExpandoObject 的正确用法

    原文地址:http://www.cnblogs.com/qiuweiguo/archive/2011/08/03/2125982.html dynamic是FrameWork4.0的新特性.dynam ...

  6. C#中dynamic的正确用法【转】

    dynamic是FrameWork4.0的新特性.dynamic的出现让C#具有了弱语言类型的特性.编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性.比如,即使你 ...

  7. 【转】C#中dynamic的正确用法

    原文:http://www.cnblogs.com/qiuweiguo/archive/2011/08/03/2125982.html dynamic是FrameWork4.0的新特性.dynamic ...

  8. Spring MVC中Session的正确用法<转>

    Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...

  9. C# string.Split对于换行符的分隔正确用法

    C# string.Split对于换行符的分隔正确用法 tmpCase "11117144-8c91-4817-9b92-99ec2f9d784a\r\n23D95A26-012C-4332 ...

随机推荐

  1. 简单的vector--- 2

    如何重载operator[]   及其相关细节 如何使用 const_cast<>(  )  和 static_cast<>( ) 模板类 如何内部声明,外部定义友元函数 使用 ...

  2. 微信公众号添加word文件

    微信公众号添加word文件的教程 我们都知道创建一个微信公众号,在公众号中发布一些文章是非常简单的,但公众号添加附件下载的功能却被限制,如今可以使用小程序“微附件”进行在公众号中添加附件. 以下是公众 ...

  3. 手写IOC实现过程

    一.手写ioc前基础知识 1.什么是IOC(Inversion of Control 控制反转)? IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良 ...

  4. sftp与ftp的区别

    SFTP和FTP非常相似,都支持批量传输(一次传输多个文件),文件夹/目录导航,文件移动,文件夹/目录创建,文件删除等.但还是存在着差异,下面我们来看看SFTP和FTP之间的区别. 1. 安全通道FT ...

  5. C#LeetCode刷题之#168-Excel表列名称(Excel Sheet Column Title)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3850 访问. 给定一个正整数,返回它在 Excel 表中相对应的 ...

  6. C#LeetCode刷题之#665-非递减数列( Non-decreasing Array)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3732 访问. 给定一个长度为 n 的整数数组,你的任务是判断在最 ...

  7. 解决@ResponseBody不能和 <mvc:annotation-driven>同时使用的问题

    我们都知道使用Springmvc的ajax很强大只要三步就可以实现: 1.引入jackson的maven到pom文件: <dependency> <groupId>com.fa ...

  8. MySQL InnoDB表空间加密

    从 MySQL5.7.11开始,MySQL对InnoDB支持存储在单独表空间中的表的数据加密 .此功能为物理表空间数据文件提供静态加密.该加密是在引擎内部数据页级别的加密手段,在数据页写入文件系统时加 ...

  9. day33:进程II

    目录 1.锁:Lock 2.信号量:Semaphone 3.事件:Event 4.进程队列:Queue 5.生产者和消费者模型 6.JoinableQueue 锁:Lock 1.锁的基本概念 上锁和解 ...

  10. 为什么LinkedList不建议使用for循环遍历,而使用iterator方式进行遍历,但ArrayList建议使用for循环进行遍历呢?

    如果使用for循环方式遍历链表,由于链表中元素是通过指针连接彼此的,不存在索引的概念,如果使用for循环方式遍历LinkedList,依次传入索引值,则就相当于每次都要将链表撸一遍. 如:在下面的这个 ...