首页 > 后端开发 > C++ > 正文

C++如何与Lua交互?C++嵌入Lua脚本引擎教程【混合编程】

尼克
发布: 2025-12-16 17:08:02
原创
847人浏览过
C++嵌入Lua核心是纯C API操作栈:初始化状态机并加载脚本;C++调用Lua函数需压参、pcall、取返回值;注册C函数供Lua调用;用userdata封装复杂数据并配元表;全程注意栈平衡。

c++如何与lua交互?c++嵌入lua脚本引擎教程【混合编程】

用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)加载标准库printstringtable等才可用)
  • 加载脚本有三种常用方式: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),返回值是“推入栈的返回值个数”:

Ghostwriter
Ghostwriter

Replit推出的AI编程助手,一个强大的IDE,编译器和解释器。

Ghostwriter 238
查看详情 Ghostwriter

立即学习C++免费学习笔记(深入)”;

  • 写一个C风格函数,例如int l_print_time(lua_State* L) { time_t t = time(nullptr); lua_pushnumber(L, (double)t); return 1; }
  • 注册到全局:lua_register(L, "os_time", l_print_time),之后Lua中就能写print(os_time())
  • 若想注册进table(如mylib),先创建table(lua_newtable(L)),再用lua_pushcfunction+lua_setfield设字段

四、在C++和Lua间传递复杂数据(table、string、userdata)

基础类型(number/string/boolean)直接用lua_pushxxx/lua_toxxx;结构体或对象建议用userdata封装,配合元表实现面向对象风格:

  • 创建userdata:MyClass* obj = (MyClass*)lua_newuserdata(L, sizeof(MyClass)); new(obj) MyClass();
  • 设置元表(定义__index__gc等):luaL_newmetatable(L, "MyClass"); lua_setmetatable(L, -2);
  • 从Lua读取table字段:先lua_getfield(L, -1, "name"),再lua_tostring,记得lua_pop清理栈
  • 向Lua返回table:用lua_createtable(L, 0, 2),然后lua_pushstring+lua_setfield键值对

基本上就这些。栈平衡是关键——每次push要配对pop,函数调用前后栈深差应等于参数个数减返回个数。多练几个小例子(比如传数组、调用带callback的C函数),很快就能上手。

以上就是C++如何与Lua交互?C++嵌入Lua脚本引擎教程【混合编程】的详细内容,更多请关注php中文网其它相关文章!

编程速学教程(入门课程)
编程速学教程(入门课程)

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号