Lua的C API,也就是主机程序可用于与Lua通信的C函数集。所有API函数以及相关的类型和常量都在头文件lua.h中声明。
API中的任何功能(函数)都可以作为宏来提供。除非另有说明,所有这样的宏都只使用它们的每个参数一次(除了第一个参数,它总是一个Lua状态),因此不会产生任何隐藏的副作用。 但要注意,与大多数C库一样,Lua API函数不会检查其参数的有效性或一致性,可通过使用定义的宏LUA_USE_APICHECK编译Lua改变这种行为。
Lua库是完全可重入的:它没有全局变量。它将需要的所有信息保存在一个动态结构中,称为Lua状态。 每个Lua状态都有一个或多个线程,它们对应于独立的、协作的执行行。类型lua_State(尽管名称不同)指的是线程(间接地,通过线程,它也引用与线程相关联的Lua状态)。指向线程的指针必须作为第一个参数传递给库中的每个函数,lua_newstate除外,它从头创建一个Lua状态,并返回指向处于新状态的主线程的指针。

当与Lua API交互时,有责任确保一致性,一定妥善控制堆栈溢出。当调用任何API函数时,必须确保堆栈有足够的空间来容纳结果。但是,当你调用一个没有固定数量结果的Lua函数时(参见lua_call), Lua会确保堆栈有足够的空间容纳所有结果,它不确保任何额外的空间。因此,在这样一个调用之后将任何东西压入堆栈之前,应该使用lua_checkstack。

API中接收堆栈索引的任何函数只能使用有效索引或可接受索引。
有效索引是指存储可修改Lua值的位置的索引。它由1和栈顶之间的堆栈索引(1≤abs(index)≤top)加上伪索引组成,伪索引表示一些C代码可以访问但不在栈内的位置。伪索引用于访问注册表(见§4.3)和C函数的上值(见§4.2)。
不需要特定的可变位置而只需要一个值的函数(例如,查询函数)可以使用可接受的索引来调用。一个可接受的索引可以是任何有效索引,但也可以是堆栈顶部之后为堆栈分配的空间内的任何正索引,即堆栈大小之前的索引。(注意,0永远都不是一个可接受的索引。)向上值的索引(见§4.2)大于当前C函数中向上值的实际数目也是可以接受的(但无效)。除非另有说明,否则API中的函数都使用可接受的索引。
可接受的索引可以避免在查询堆栈时对堆栈顶部进行额外的测试。例如,一个C函数可以查询它的第三个参数,而不需要检查是否有第三个参数,也就是说,不需要检查3是否是一个有效的索引。
对于可以使用可接受索引调用的函数,任何无效索引都被视为包含虚拟类型LUA_TNONE的值,该值的行为类似于nil值。

c++17进阶(2)-Lua扩展(1)相关推荐

  1. 给lnmp一键包中的nginx安装openresty的lua扩展

    lnmp一键包(https://lnmp.org)本人在使用之后发现确实好用,能帮助我们快速搭建起lnmp.lamp和lnmpa的web生产环境,因此推荐大家可以多试试.但有的朋友可能需要使用open ...

  2. lua安全之关于lua扩展第三方库

    android lua require第三方扩展库有三种方式: 1. 用c实现独立的lua模块作为android的第三方动态库来引入,优点是lua扩展库独立方便更新替换,缺点是需要修改虚拟机,开启宏支 ...

  3. lua怎么嵌入php,linux下安装php的lua扩展

    1. 进入管理员权限使用yum安装 readline(也可以使用wget下载后./configure 然后 make && make install进行安装) yum install ...

  4. xcode下lua扩展库的编译

    最近在研究ios越狱下的touchsprite脚本的开发. touchsprite的脚本语言是lua, 有个需求是需要通过touchsprite批量导入联系人到ios里. 看了一下touchsprit ...

  5. 用lua扩展你的Nginx(写的非常好)

    一. 概述 Nginx是一个高性能,支持高并发的,轻量级的web服务器.目前,Apache依然web服务器中的老大,但是在全球前1000大的web服务器中,Nginx的份额为22.4%.Nginx采用 ...

  6. 用lua扩展你的Nginx(整理)

    首先得声明.这不是我的原创,是在网上搜索到的一篇文章,原著是谁也搞不清楚了.按风格应该是属于章亦春的文章. 整理花了不少时间,所以就暂写成原创吧. 一. 概述 Nginx是一个高性能.支持高并发的,轻 ...

  7. lua怎么嵌入php,Linux下安装PHP的lua扩展库

    一.安装Lua 5.3.4 下载 http://www.lua.org/ftp/lua-5.3.4.tar.gz tar xvf lua-5.3.4.tar.gz cd lua-5.3.4 重要:进入 ...

  8. c++17进阶(3)-Boehm GC垃圾回收(1)

    Boehm-Demers-Weiser garbage collector,也就是著名的Boehm GC,是计算机应用在C/C++语言上的一个保守的垃圾回收器,可应用于许多经由C/C++开发的项目,同 ...

  9. 【英语:基础进阶_原著扩展阅读】J2.手把手教你阅读如何查词

    1.读初级英文原版书籍的顺序 基础不是很好的同学, 可选择中英双语版本的书籍. 顺序: 先读英文再读中文, 最后再回到英文版本. 原因: 如果说你先读了中文再读英文的话, 大脑会省去了一个思考理解以及 ...

最新文章

  1. QIIME 2用户文档. 9数据导出Exporting data(2018.11)
  2. js中event,event.srcElement,event.target在IE和firefox下的兼容性
  3. 全球及中国二叔丁基氢醌行业容量规模与供求趋势分析报告2022版
  4. Sigma Grid 2.4 探究 1
  5. 源码编译mysql5.5_源码编译安装MySQL5.5
  6. RecyclerView(四)设置分割线样式(Android 5.0 新特性)
  7. @程序员,早知道假期这样你会干什么?
  8. java调用tuxedo中间件,BEA-TUXEDO中间件介绍.ppt
  9. linear-gradient常用实现效果
  10. 部署jar包项目到服务器上
  11. pythonturtle是标准库_Python常用标准库1-Turtle,Random,Time和Datetime
  12. pandas GUI 神器 D-Tale,可视化操作自动转代码
  13. 潮流计算程序————支路功率计算与输出程序
  14. 生容易,活容易,生活不容易
  15. oracle表自动模拟多条数据,Oracle使用虚拟表dual一次插入多条记录
  16. ubuntu 本地和服务器scp文件传输
  17. 我的世界无限贪婪服务器,我的世界无尽贪婪mod
  18. 2022.10.28 英语背诵
  19. 美光科技股价上涨13% 创下自2011年12月以来最大单日涨幅
  20. 【宋红康 MySQL数据库 】【高级篇】【12】性能分析工具的使用

热门文章

  1. centos 6.5升级openssl
  2. linux命令学习之:curl
  3. Timus 1049 Brave Balloonists
  4. 图片碎片化mask动画
  5. Android高效编程注意事项
  6. Generic Host Process for Win32 Service错误
  7. 爬虫工具——Selenium和PhantomJS
  8. python报错 TypeError: an integer is required
  9. JavaScript eval() 函数的用法
  10. perl malformed JSON string, neither tag, array, object, number, string or atom, at character offset