C++嵌入Lua核心是纯C API操作栈:初始化状态机并加载脚本;C++调用Lua函数需压参、pcall、取返回值;注册C函数供Lua调用;用userdata封装复杂数据并配元表;全程注意栈平衡。

用C++嵌入Lua,核心是调用Lua C API完成栈操作、函数调用和数据交换。不依赖第三方绑定库(如sol2或LuaBridge),纯C API方式最轻量、最可控,也最能帮你理解底层交互逻辑。
一、初始化Lua环境并加载脚本
先链接lua5.4.lib(或对应版本)并包含头文件lua.hpp(或分开包含lua.hlauxlib.hlualib.h)。创建Lua状态机是第一步:
- 调用
luaL_newstate()获得lua_State*指针,这是整个Lua世界的入口 - 用
luaL_openlibs(L)加载标准库(print、string、table等才可用) - 加载脚本有三种常用方式:
luaL_dostring(L, "print('hello')")(字符串)、luaL_loadfile(L, "main.lua") + lua_pcall(文件)、luaL_loadbuffer(内存块)
二、C++调用Lua函数
前提是Lua函数已存在(全局或放在table里),调用过程本质是“压参→调用→取返回值”,全程操作Lua栈:
- 用
lua_getglobal(L, "add")把全局函数add压入栈顶 - 用
lua_pushnumber(L, 10)、lua_pushnumber(L, 20)依次压入参数(顺序即调用顺序) - 调用
lua_pcall(L, 2, 1, 0):2个参数、期望1个返回值、无错误处理函数 - 调用后栈顶是返回值,用
lua_isnumber(L, -1)判断类型,再用lua_tonumber(L, -1)取出,最后lua_pop(L, 1)清理
三、Lua调用C++函数(注册C函数)
让Lua能直接调用C++逻辑,需把C函数注册为Lua全局函数或table成员。注意:C函数签名固定为int func(lua_State* L),返回值是“推入栈的返回值个数”:
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~