【2014-09-02】Lua快速学习笔记:在C/C++中调用Lua脚本API [历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2014-09-02 标题Lua快速学习笔记在C/C中调用Lua脚本API分类编程 / C C / Lua 标签luaLua快速学习笔记在C/C中调用Lua脚本API备注lua\_load:luaL\_loadfileluaL\_loadstringlua\_calllua\_pcall:luaL\_dofileluaL\_dostring备注1 本笔记只记录了LUA的一小部分内容对于LUA的描述并不全面以后随用随增加吧。2 本笔记参考《Lua程序设计 第二版》截图和代码属于原作者所有。3 作者初学LUA经验和能力有限笔记可能有错误还请各位路过的大牛们给予指点。4 API参考网址参考网址 http://www.codingnow.com/2000/download/lua_manual.htmllua_load:读取lua脚本字符进入lua环境中内部函数。int lua_load (lua_State *L,lua_Reader reader,void *data,const char *chunkname);加载一个 Lua chunk 。 如果没有错误 lua_load 把一个编译好的 chunk 作为一个 Lua 函数压入堆栈。 否则压入出错信息。 l ua_load 的返回值可以是0:没有错误LUA_ERRSYNTAX:在预编译时碰到语法错误LUA_ERRMEM:内存分配错误。这个函数仅仅加栽 chunk 而不会去运行它。lua_load 会自动检测 chunk 是文本的还是二进制的 然后做对应的加载操作参见程序 luac。lua_load 函数使用一个用户提供的 reader 函数来 读取 chunk 参见 lua_Reader。 data 参数会被传入读取器函数。chunkname 这个参数可以赋予 chunk 一个名字 这个名字被用于出错信息和调试信息参见 §3.8。luaL_loadfileint luaL_loadfile (lua_State *L, const char *filename);Loads a file asa Lua chunk. This function useslua_loadto load the chunk in the file named filename. If filename is NULL, then it loads from the standard input. The first line in the file is ignored if it starts with a #.This function returns the same results as lua_load, but it has an extra error code LUA_ERRFILE if it cannot open/read the file.As lua_load, this functiononly loads the chunk; it does not run it.luaL_loadstringint luaL_loadstring (lua_State *L, const char *s);Loads a string asa Lua chunk. This function uses lua_load to load the chunk in the zero-terminated string s.This function returns the same results as lua_load.Also as lua_load, this functiononly loads the chunk; it does not run it.lua_call调用一个函数。void lua_call (lua_State *L, int nargs, int nresults);要调用一个函数请遵循以下协议首先要调用的函数应该被压入堆栈接着把需要传递给这个函数的参数按正序压栈 这是指第一个参数首先压栈。最后调用一下 lua_callnargs 是你压入堆栈的参数个数。当函数调用完毕后所有的参数以及函数本身都会出栈而函数的返回值这时则被压入堆栈。返回值的个数将被调整为 nresults 个 除非 nresults 被设置成 LUA_MULTRET。 在这种情况下所有的返回值都被压入堆栈中。 Lua 会保证返回值都放入栈空间中。函数返回值将按正序压栈第一个返回值首先压栈 因此在调用结束后最后一个返回值将被放在栈顶。被调用函数内发生的错误将通过 longjmp一直上抛。下面的例子中这行 Lua 代码等价于在宿主程序用 C 代码做一些工作a f(“how”, t.x, 14)这里是 C 里的代码lua_getfield(L,LUA_GLOBALSINDEX,f);/* 将调用的函数 */lua_pushstring(L,how);/* 第一个参数 */lua_getfield(L,LUA_GLOBALSINDEX,t);/* table 的索引 */lua_getfield(L,-1,x);/* 压入 t.x 的值第 2 个参数*/lua_remove(L,-2);/* 从堆栈中移去 t */lua_pushinteger(L,14);/* 第 3 个参数 */lua_call(L,3,1);/* 调用 f传入 3 个参数并索取 1 个返回值 */lua_setfield(L,LUA_GLOBALSINDEX,a);/* 设置全局变量 a */注意上面这段代码是“平衡”的 到了最后堆栈恢复成原由的配置。 这是一种良好的编程习惯。lua_pcall:以保护模式调用一个函数。lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);nargs 和 nresults 的含义与 lua_call 中的相同。 如果在调用过程中没有发生错误lua_pcall 的行为和 lua_call 完全一致。 但是如果有错误发生的话 lua_pcall 会捕获它 然后把单一的值错误信息压入堆栈然后返回错误码。 同 lua_call 一样lua_pcall 总是把函数本身和它的参数从栈上移除。如果 errfunc 是 0返回在栈顶的错误信息就和原始错误信息完全一致。 否则errfunc 就被当成是错误处理函数在栈上的索引。 在当前的实现里这个索引不能是伪索引。 在发生运行时错误时 这个函数会被调用而参数就是错误信息。 错误处理函数的返回值将被 lua_pcall 作为出错信息返回在堆栈上。典型的用法中错误处理函数被用来在出错信息上加上更多的调试信息比如栈跟踪信息 (stack traceback) 。 这些信息在 lua_pcall 返回后因为栈已经展开 (unwound) 所以收集不到了。lua_pcall 函数在调用成功时返回 0 否则返回以下定义在 lua.h 中的错误代码中的一个LUA_ERRRUN: 运行时错误。LUA_ERRMEM: 内存分配错误。 对于这种错Lua 调用不了错误处理函数。LUA_ERRERR: 在运行错误处理函数时发生的错误。luaL_dofile#define luaL_dofile(L, fn)(luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))luaL_dostring#define luaL_dostring(L, s)(luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0))

相关新闻

最新新闻

单片机毕业设计-基于单片机与 WiFi 的智能垃圾分类监测装置设计与开发 基于语音交互的智能垃圾分类控制系统设计(025105)

单片机毕业设计-基于单片机与 WiFi 的智能垃圾分类监测装置设计与开发 基于语音交互的智能垃圾分类控制系统设计(025105)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/9/1 16:07:08
终结低效代码审查:自动化与合并队列如何重构研发流程

终结低效代码审查:自动化与合并队列如何重构研发流程

把代码审查“终结”掉,听起来像是在挑战工程界的政治正确。但如果你问任何一个被 PR 卡了两天、合并队列排了十个小时、或者因为一条格式注释来回拉扯三轮的开发者,他心里大概都想过同一个问题:这玩意儿到底是在保证质量,还是在给…

2026/9/1 16:07:08
单片机毕业设计-基于 STM32 或 51 单片机的垃圾桶满溢与安全检测系统设计 基于 STM32 或 51 单片机的自动开合智能垃圾桶控制系统设计(025005)

单片机毕业设计-基于 STM32 或 51 单片机的垃圾桶满溢与安全检测系统设计 基于 STM32 或 51 单片机的自动开合智能垃圾桶控制系统设计(025005)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/9/1 16:07:08
第16章 供应域:供应商数据与采购数据的资产化​​

第16章 供应域:供应商数据与采购数据的资产化​​

某快消品集团采购总监在年度供应商大会上说:“我们合作了800家供应商,积累了十五年的交货记录、质量数据和价格谈判结果。这些数据是我们选择供应商、控制成本、保障品质的核心武器。”CFO反问:“这些武器在报表上值多少钱?”采购…

2026/9/1 16:07:08
小满春招Java第三批笔试复盘:从算法到Spring Boot实战

小满春招Java第三批笔试复盘:从算法到Spring Boot实战

说实话,收到“小满春招JAVA研发岗第三批笔试”通知的时候,我整个人是有点懵的。前两批笔试的动静我多少有所耳闻,群里陆陆续续有人晒题,结果到了第三批,通知异常安静,连个像样的考纲都没附。这意味着什么&a…

2026/9/1 16:07:08
android开发转到java后端开发--Lambda

android开发转到java后端开发--Lambda

Lambda 表达式(Lambda Expression)是 Java 8 中最为重要的里程碑特性。它的本质是一个匿名函数(即没有名称的方法),其核心价值在于将行为(逻辑)作为参数传递给方法,从而实现行为参数化(Behavior Parameterization),让代码表达更接近自然语言的声明式编程风格。 你可…

2026/9/1 16:02:08