lua 基础教程
针对Lua5.3和5.4版本更新了CAPI交互示例,涵盖C/C++执行Lua脚本、调用Lua函数及Lua回调C/C++函数三个实用场景。代码经重新编写并附有详细笔记与注释,适合初学者入门参考,助力快速掌握混合编程技巧。
最近在折腾 Lua,翻了不少资料,发现网上很多例子用的还是老版本的 C API,和 5.3、5.4 差距不小。索性自己动手,把以前别人的博客例子重新改了一遍,换成最新的 Lua C API,顺便做个笔记,希望对刚入门的同学有点帮助。

基础语法就不展开了,咱们直接从最实用的三个场景开始:C/C++ 执行 Lua 脚本、C/C++ 调用 Lua 函数、以及 Lua 反过来调用 C/C++ 函数。
1. C/C++ 执行 Lua 脚本
这个最基础,说白了就是让 C++ 代码去跑一段写好的 .lua 文件。代码很简单,直接上示例:
#include#include #include #include extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" }; using namespace std; int main() { lua_State *pLuaState = luaL_newstate(); /*载入lua基本库*/ luaL_openlibs(pLuaState); /*运行脚本*/ luaL_dofile(pLuaState,"./script/hw.lua"); /*清除lua*/ lua_close(pLuaState); cout<<"Press enter to exit…"< 对应的
hw.lua就一行:print("Hello Word!");这里面值得提一嘴的是函数的选择。早期版本(5.0)用
lua_open,5.1 把它定义成了luaL_newstate的宏,到 5.2 之后干脆连宏都去掉了。现在推荐直接用luaL_newstate,它内部会采用默认的内存分配函数。如果对内存管理有特殊需求,也可以直接调用更底层的lua_newstate,不过一般情况下用辅助库就足够了。另外注意:注释掉的那几行
luaopen_base、luaopen_io等是老版本逐个加载库的做法,现在用luaL_openlibs一步到位,把所有标准库都打开,省心。2. C/C++ 调用 Lua 函数
比刚才更进一步:C++ 程序不仅执行 Lua 脚本,还能调用脚本里定义的函数,传递参数并获取返回值。看代码:
#include#include #include #include extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" }; using namespace std; int luaadd(lua_State *L, int x, int y) { int sum; /*通过名字获取Lua函数*/ lua_getglobal(L,"add"); /*向栈中压入第一个参数*/ lua_pushnumber(L,x); /*向栈中压入第二个参数*/ lua_pushnumber(L,y); /*调用函数*/ lua_call(L,2,1); /*得到结果*/ sum = (int)lua_tointeger(L,-1); /*从堆栈中弹出n个元素*/ lua_pop(L,1); return sum; } int main() { int sum; lua_State *L = luaL_newstate(); luaL_openlibs(L); luaL_dofile(L,"./script/test.lua"); sum = luaadd(L,10,15); cout<<"The sum = "< Lua 那边的
test.lua很简单:function add(x,y) return x + y; end这里关键是对栈的操作。Lua 和 C 之间的数据交换全靠一个虚拟栈:先把函数压栈,再按顺序压入参数,然后用
lua_call触发调用,最后从栈顶取回返回值。栈的顺序要记清楚:第一个参数先压入,最终返回值在栈顶。关于栈的更多细节,也是新手容易懵的地方,后面有机会再单独展开聊。3. Lua 调用 C/C++ 函数
反过来,Lua 脚本里也能调用 C++ 写的函数。注册一个 C 函数到 Lua 环境里,然后像普通 Lua 函数一样使用。代码示例:
#include#include #include #include extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" }; using namespace std; static int a verage(lua_State *L) { /*得到参数个数*/ int n = lua_gettop(L); double sum = 0; int i; for (i = 1; i <= n; i++) { sum += lua_tonumber(L,i); } /*压入平均值*/ lua_pushnumber(L,sum/n); /*压入和*/ lua_pushnumber(L,sum); /*返回返回值个数*/ return 2; } int main() { lua_State *L = luaL_newstate(); luaL_openlibs(L); /*注册函数*/ lua_register(L,"a verage",a verage); luaL_dofile(L,"./script/a vg.lua"); lua_close(L); cout<<"Press enter to exit…"<
a vg.lua里这样调用:function main() local a vg,sum = a verage(2,2,2,2,2); print("The a vg is", a vg); print("The sum is", sum); end main();这个例子展示了如何用
lua_register把一个 C 函数注册为 Lua 全局函数。C 函数内部通过lua_gettop获取参数个数,用lua_tonumber逐个读取参数,最后用lua_pushnumber压入返回值。注意返回值个数通过函数的 return 语句告诉 Lua 解释器。这里返回了两个值:平均值和总和,Lua 脚本里用多变量赋值就能一次接收。三个例子走下来,基本上覆盖了 Lua 与 C/C++ 交互的全路径:从单向执行,到双向调用,再到函数注册。栈操作是贯穿始终的核心,理解了栈,Lua 的 C API 也就通了七八分。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















