C++ 识别 .lua文件内用户自定义的全局函数

摘要:

   此系列是为经手的项目介绍编译和使用,以及项目开发过程中遇到的bug解决方案或项目开发过程中有意思的需求设计等等项目相关的博文。

   此篇是为开发自定义界面项目过程中系统页面与脚本交互的一个小需求,系统导入用户自己编写的.lua脚本文件,需要页面获取.lua文件内用户自定义的函数名称,并保存到系统供控件后续绑定调用。

(开发环境:VSCode,cmake,Qt5)

关键词C++lua项目开发问题需求分析

声明:本文作者原创,转载请附上文章出处与本文链接。

文章目录

      • 摘要:
      • 正文:
        • 解决方案
        • 解决
      • 推荐阅读

正文:

print("lua load")
function Example1()print("lua load1")
endfunction Example2()print("lua load2")
endfunction Example3()print("lua load3")
endfunction Example4()print("lua load4")
end

   用户定义的.lua文件类似这样,系统页面需要获取到Example1,Example2,Example3,Example4。难点在于用户需要高自定义性,不能过多限制用户编写的.lua文件,又需要精确识别,不能多也不能少。

解决方案

通过internet,以及stackoverflow1、stackoverflow2找到四种解决方案:

  • 第一种就是给用户做点小限制,让用户把需要导入的脚本函数归类到一个表(例如functions),然后系统页面迭代这个函数包也行,比较方便,效率也高。
  • 第二种不做限制,系统页面找.lua文件的"_G"的全局函数表,表内包括用户定义的全局对象和默认函数例如print之类的,不过如果用户导包了,默认函数会更多, 获取_G集合后减去默认函数集合得到用户定义的函数集合,效率比较低准确度也不好把握容易出错。
  • 第三种C++逐行获取字符串匹配function关键字后在" “和”(" 之间的就是函数名保存下来即可,效率20行大概0.2ms ,不过也要考虑local和print-function相关字符串等,参考:https://www.cnblogs.com/dechinphy/p/cppio.html。
  • 第四种使用第三方lbci lua字节编码检测器,没深入了解,感觉很麻烦,要解析运行后的编码。
解决

   综合考虑使用第一种,限制小准确度高开发也比较方便,那么本质上也只是C++ 与 lua数据交互的问题。

-- .lua文件
print("lua load")
functions = {}function functions.Example1()print("lua load1")
endfunction functions.Example2()print("lua load2")
endfunction functions.Example3()print("lua load3")
endfunction Example4()print("lua load4")
end
// 识别.lua	CCustomLuaBridge.cpp
// lua_State *Lua		Lua状态机
// QString luaPath		./lua文件路径
// bool openSuccess		是否成功载入.lua文件
......
{QStringList nameList;// 加载Lua脚本  if (luaL_loadfile(Lua, luaPath.toStdString().c_str()) != LUA_OK || lua_pcall(Lua, 0, LUA_MULTRET, 0)) {  qDebug() << "Error loading/running Lua script: " << lua_tostring(Lua, -1);  lua_pop(Lua, 1); 	// 移除错误消息    lua_close(Lua);     // 关闭Lua状态机openSuccess = false;return QStringList();}openSuccess = true;// 将全局环境functions压入栈顶lua_getglobal(Lua, "functions");// 检查栈顶functions是否是一个表if (!lua_istable(Lua, -1)) {qDebug() << "Error: functions is not a table";lua_pop(Lua, 1);    // 移除栈顶元素lua_close(Lua);     // 关闭Lua状态机return QStringList();  }// 遍历functions表lua_pushnil(Lua); // 第一个keywhile (lua_next(Lua, -2)) {// -1 是值,-2 是键// 检查值是否是一个函数if (lua_isfunction(Lua, -1)) {// 获取键(函数名)const char* functionName = lua_tostring(Lua, -2);qDebug() << "Found function: " << functionName;nameList << functionName;}  // 移除值(保留键用于下一次迭代)lua_pop(Lua, 1);}nameList.sort();	// 排序一下// 移除表lua_pop(Lua, 1);lua_close(Lua);     // 关闭Lua状态机return nameList;
}
......

主体功能完成,后续就是完善需求细节部分,导入脚本以及刷新机制等等。

推荐阅读

博客主页:https://blog.csdn.net/weixin_45068267
(客官逛一逛,有许多其它有趣的专栏博文)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/38894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

气膜建筑照明:吊式与落地灯杆的利弊—轻空间

气膜建筑以其独特的设计和高效的功能性&#xff0c;广泛应用于体育场馆、工厂等各类场所。在这些气膜建筑中&#xff0c;照明方式的选择尤为重要。尽管有多种照明方式可供选择&#xff0c;但常用的反射光源形式在气膜建筑中尤为普遍。轻空间将重点介绍两种常用的反射照明方式&a…

Node端使用工作线程来解决日志开销-处理IO密集型任务

我们的BBF层很多时候会作为中间层处理后端到前端的数据&#xff0c;当然大部分时候都只是作为请求 / 响应的数据组装中心&#xff0c;但是有一个插件是怎么都绕不过去的&#xff1a;Log4js。 内部我们在Node层打印了很多日志。结果这周仔细分析了一下服务器处理请求到响应的中间…

Linux中vim文本编辑器你了解多少?

在Linux中&#xff0c;vim&#xff08;Vi IMproved&#xff09;是一个非常强大的文本编辑器&#xff0c;它基于更古老的vi编辑器&#xff0c;并添加了许多增强功能。vim有几种不同的模式&#xff0c;包括命令模式、插入模式和可视模式&#xff0c;每种模式都有特定的功能和快捷…

音乐:触动心灵的艺术语言

Enjoy your music 音 乐 作为一种跨越时空和文化的艺术形式&#xff0c;拥有着无穷的魅力和力量。 它不仅能够带给我们愉悦的听觉享受&#xff0c;还对我们的身心健康、认知发展和社会交往产生着深远的影响。 一、音乐的基本元素 音乐由多个基本元素构成&#xff0c;包括…

【CentOS7.6】yum 报错:Could not retrieve mirrorlist http://mirrorlist.centos.org

一、报错 1.报错内容如下 在使用 yum makecache 命令时报错&#xff0c;在 yum install -y xxx 的时候报错等等 [roothcss-ecs-a901 yum.repos.d]# yum makecache Loaded plugins: fastestmirror Determining fastest mirrors Could not retrieve mirrorlist http://mirrorl…

Linux 常见的几种编辑器的操作步骤

在大多数命令行文本编辑器中&#xff0c;保存并关闭文件的操作方式基本相似。以下是常见的几种编辑器的操作步骤&#xff1a; 使用 vi 编辑器保存并关闭文件 编辑文件&#xff1a; sudo vi /path/to/file 编辑内容&#xff1a; 按 i 进入插入模式&#xff0c;编辑文件内容。 …

Go 语言条件语句

Go 语言条件语句 在编程语言中&#xff0c;条件语句用于根据特定条件执行不同的代码路径。Go 语言提供了几种条件语句&#xff0c;包括 if、switch 和 select。这些语句使得程序可以根据不同的条件执行不同的操作&#xff0c;从而实现程序的逻辑分支。 1. if 语句 if 语句是…

【web APIs】快速上手Day03

目录 Web APIs - 第3天全选文本框案例事件流事件捕获事件冒泡阻止冒泡解绑事件on事件方式解绑addEventListener方式解绑 注意事项-鼠标经过事件的区别两种注册事件的区别 事件委托综合案例-tab栏切换改造 其他事件页面加载事件元素滚动事件页面滚动事件-获取位置页面滚动事件-滚…

巴西东南湾乌巴图巴 ANTARES 监测站数据

ANTARES monitoring station in Ubatuba, Southeast Brazilian Bight 巴西东南湾乌巴图巴 ANTARES 监测站 简介 ANTARES 区域网络由分布在拉丁美洲的沿岸时间序列站组成。主要目的是研究气候和人为影响引起的长期变化&#xff0c;以及用于卫星匹配和算法开发的海洋颜色。Uba…

SoftCLT: 时间序列的软对比学习《Soft Contrastive Learning for Time Series》(时间序列、时序分类任务、软...

2024年6月25日&#xff0c;10:11&#xff0c;好几天没看论文了&#xff0c;一直在摸鱼写代码(虽然也没学会多少)&#xff0c;今天看一篇师兄推荐的。 论文&#xff1a; Soft Contrastive Learning for Time Series 或者是&#xff1a; Soft Contrastive Learning for Time Seri…

[C++][设计模式][组合模式]详细讲解

目录 1.动机(Motivation)2.模式定义3.要点总结4.代码感受 1.动机(Motivation) 软件在某些情况下&#xff0c;客户代码过多地依赖于对象容器复杂的内部实现结构&#xff0c;对象容器内部实现结构(而非抽象结构)的变化引起客户代码的频繁变化&#xff0c;带来了代码的维护性、扩…

【Android面试八股文】什么是ANR?如何分析和定位ANR?如何避免ANR?

文章目录 一、ANR概述二、触发ANR的主要场景三、Android四大组件中的潜在的ANR风险五、避免ANR的实践建议六、ANR的产生原因与出现的场景6.1 原因:6.2 出现场景:七、ANR的定位与分析7.1. ANR分析思路——traces7.2 ANR其他分析思路与相关日志7.2.1 分析logcat思路7.2.2 分析k…

解释Java中的Java IO流模型。

Java IO流模型是Java中用于处理输入和输出的基础模型。它通过一组类和接口来实现文件、网络和其他I/O设备的读写操作。Java IO流模型主要包括以下几个部分&#xff1a; 1. **InputStream和OutputStream**&#xff1a;这些类是Java IO的核心&#xff0c;它们提供了一种抽象的方…

如何避免爬取网站时IP被封?

互联网协议 (IP) 地址是识别网络抓取工具的最常见方式。IP 是每个互联网交换的核心&#xff0c;对其进行跟踪和分析可以了解很多有关连接客户端的信息。 在网络抓取中&#xff0c;IP 跟踪和分析&#xff08;又名指纹&#xff09;通常用于限制和阻止网络抓取程序或其他不需要的访…

计算两个经纬度之间的球面距离(基于Mysql和PHP实现)

计算两个经纬度之间的球面距离 1、MySQL实现方式 - 基于空间函数(ST_Distance_Sphere)实现 前置条件&#xff1a;确保您使用的是 MySQL 8.0 或更高版本&#xff0c;因为较早的版本对地理空间的支持有限。 1.1 创建表和索引 说明&#xff1a;设置 location 为 point 类型 #…

hive乱码问题完全解决方案

修改数据库编码集 SET GLOBAL character_set_client utf8; SET GLOBAL character_set_connection utf8; SET GLOBAL character_set_database utf8; SET GLOBAL character_set_results utf8; SET GLOBAL character_set_server utf8; show variables like ‘character_set%…

c++ set和unordered_set区别

一.set介绍 C 中的 set 容器是一种关联容器&#xff0c;用于存储唯一的元素&#xff0c;并能够根据特定的顺序对元素进行排列。在这里&#xff0c;我们将对 set 容器进行详细的分析。 概述 set 容器是 C标准库中的一个部分&#xff0c;位于 头文件中。它是一个关联容器&…

基于Java的智能城市解决方案

基于Java的智能城市解决方案 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨基于Java的智能城市解决方案&#xff0c;探索如何利用现代技术构建智…

【Python数据分析及环境搭建】:教程详解1(第23天)

系列文章目录 Python进行数据分析的优势常用Python数据分析开源库介绍启动Jupyter服务Jupyter Notebook的使用 文章目录 系列文章目录前言学习目标1. Python进行数据分析的优势2. 常用Python数据分析开源库介绍2.1 NumPy2.2 Pandas2.3 Matplotlib2.4 Seaborn2.5 Sklearn2.6 Ju…

[AHK V2]鼠标悬停展开窗口,鼠标离开折叠窗口

演示鼠标悬停窗口标题栏则展开窗口&#xff0c;鼠标离开窗口标题栏则折叠窗口。 ;作者&#xff1a;sunwind ;日期&#xff1a;2024年6月30日11:36:08 ;脚本&#xff1a;演示鼠标悬停窗口标题栏则展开窗口&#xff0c;鼠标离开窗口标题栏则折叠窗口。 MyGui : Gui() mytext:MyG…