当前位置: 首页 > news >正文

专业网站设计工作室小程序引流推广平台

专业网站设计工作室,小程序引流推广平台,2008iis网站属性,广州大型网站设计公司前言 本篇在讲什么 Lua的require相关的内容 本篇需要什么 对Lua语法有简单认知 对C语法有简单认知 依赖Visual Studio工具 本篇的特色 具有全流程的图文教学 重实践,轻理论,快速上手 提供全流程的源码内容 ★提高阅读体验★ 👉 ♠…
前言
本篇在讲什么

Lua的require相关的内容
本篇需要什么

Lua语法有简单认知
C++语法有简单认知
依赖Visual Studio工具

本篇的特色

具有全流程的图文教学
重实践,轻理论,快速上手
提供全流程的源码内容


★提高阅读体验★

👉 ♠ 一级标题 👈

👉 ♥ 二级标题 👈

👉 ♣ 三级标题 👈

👉 ♦ 四级标题 👈

目录

  • ♠ 前言
  • ♠ 前瞻
  • ♠ require的定义
  • ♠ Lua的加载器
  • ♠ 简单的断点调试
  • ♠ require自定义文件
    • ♥ 修改Lua_Path
  • ♠ 自定义加载器
    • ♥ 自定义
  • ♠ 推送
  • ♠ 结语


♠ 前言

想在Lua代码中去require非.lua后缀的文件,发现需要去自定义一下Lua的加载器,这里我们先从c源码的角度去探究一下require的过程,再自定义一个加载器去加载指定后缀的Lua代码文件


♠ 前瞻

阅读本篇文章需要准备编译Lua源码的工程,详情可参考下面文章

Lua学习笔记:在Visual Studio中调试Lua源码和打断点

阅读本篇文章前最好提前了解C/C++和Lua的交互原理,详情可参考下面文章

Lua学习笔记:C/C++和Lua的相互调用

阅读本篇文章前最好提前了解Lua的package,详情可参考下面文章

Lua学习笔记:探究package

阅读本篇文章前最好提前了解Lua的词法分析,详情可参考下面文章

Lua学习笔记:词法分析


♠ require的定义

require的本质其实是注册在_G内的一个全局函数,在Lua中如果把_G去dump一下,可以看到方法名字在其中

在这里插入图片描述

原型函数定义在源码loadlib.c中,名为ll_require的函数,其在luaopen_package函数中被注册到全局表当中

在这里插入图片描述


♠ Lua的加载器

在Lua初始化的时候定义了几个默认加载器去读取文件内容,在loadlib.c文件中的luaopen_package方法中去初始化了加载器

在这里插入图片描述

其中loader_lua就是用来加载Lua文件的默认加载器,只要是require一个lua文件就默认会执行

在这里插入图片描述


♠ 简单的断点调试

我们预先准备了两个Lua文件,加几个断点来看一下执行流程,Lua代码如下所示

在这里插入图片描述

我们分别在ll_requireloader_Lua函数中添加了断点,在执行后,依次执行了两个函数,最终在luaL_loadfile函数中完成对require文件的词法分析

在这里插入图片描述

在这里插入图片描述


♠ require自定义文件

默认的对Lua的读取只支持.lua后缀的文件,我们可以通过几种不同的方式去改变这一策略


♥ 修改Lua_Path

Lua的package表中字段path留存的就是文件的搜索路径,我们可以通过补充搜索路径来达到目的

在这里插入图片描述

可以直接通过修改源码中的LUA_PATH_DEFAULT定义,去使得Lua程序可以加载.luac结尾的文件,执行后可直接被require

在这里插入图片描述

源码可能并不是能随便修改的,我们也可以直接在Lua代码中为package.path添加搜索路径,如下图所示

在这里插入图片描述


♠ 自定义加载器

如果require的文件后缀不是.lua在require的时候会报错,原因是在默认加载器loader_Lua并没有设定对其他后缀的加载方式,不过我们可以自定义加载器

在这里插入图片描述

在这里插入图片描述


♥ 自定义

如下述代码所示,在执行脚本加载之前,将loaders的默认加载器替换成我们自定义的函数就可以了

int myLuaLoader(lua_State * L)
{std::string filename(luaL_checkstring(L, 1));return 1;
}void addLuaLoader(lua_State * _state, lua_CFunction func)
{if (!func) return;lua_getglobal(_state, "package");                                  /* L: package */lua_getfield(_state, -1, "loaders");                               /* L: package, loaders */lua_pushcfunction(_state, func);                                   /* L: package, loaders, func */for (int i = (int)(lua_objlen(_state, -2) + 1); i > 2; --i){lua_rawgeti(_state, -2, i - 1);                                /* L: package, loaders, func, function */lua_rawseti(_state, -3, i);                                    /* L: package, loaders, func */}lua_rawseti(_state, -2, 2);                                        /* L: package, loaders */lua_setfield(_state, -2, "loaders");                               /* L: package */lua_pop(_state, 1);}int main()
{lua_State* L = luaL_newstate();luaL_openlibs(L);addLuaLoader(L, myLuaLoader);luaL_dofile(L, "lua_src/test.lua");lua_close(L);
}

我们在myLuaLoader函数中加入断点,在执行程序后已经可以获取到对应的文件名字了

在这里插入图片描述

接下来,我们补充函数内容,让其可以去识别到特定后缀的文件,很简单,直接拼接.luac结尾后缀,然后去loadfile,大家可以根据自己需求去扩展

int myLuaLoader(lua_State * L)
{const char *filePath = "D:\\work\\cToLua\\Debug_Lua\\";const char *name = luaL_checkstring(L, 1);const char *suffix = ".luac";char *filename = (char *)malloc(strlen(filePath) + strlen(name)+ strlen(suffix));sprintf(filename, "%s%s%s", filePath, name, suffix);if (luaL_loadfile(L, filename) != 0)return 0;return 1;
}

♠ 推送

  • Github
https://github.com/KingSun5

♠ 结语

若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

👉 本文属于原创文章,转载请评论留言,并在转载文章头部著名作者出处👈

文章转载自:
http://unexcelled.zpfr.cn
http://bathtub.zpfr.cn
http://amphoric.zpfr.cn
http://prickle.zpfr.cn
http://logged.zpfr.cn
http://oneself.zpfr.cn
http://ammoniation.zpfr.cn
http://manlike.zpfr.cn
http://gigsman.zpfr.cn
http://stereochemistry.zpfr.cn
http://spidery.zpfr.cn
http://endosperm.zpfr.cn
http://disseise.zpfr.cn
http://elicitation.zpfr.cn
http://obstetrician.zpfr.cn
http://demiworld.zpfr.cn
http://lossy.zpfr.cn
http://defraud.zpfr.cn
http://vasa.zpfr.cn
http://declinate.zpfr.cn
http://hybridise.zpfr.cn
http://paperful.zpfr.cn
http://libate.zpfr.cn
http://downriver.zpfr.cn
http://photoelement.zpfr.cn
http://somnivolency.zpfr.cn
http://underripe.zpfr.cn
http://relegation.zpfr.cn
http://styliform.zpfr.cn
http://digenesis.zpfr.cn
http://flocculate.zpfr.cn
http://intractably.zpfr.cn
http://demeter.zpfr.cn
http://tarsia.zpfr.cn
http://protectory.zpfr.cn
http://raza.zpfr.cn
http://tracery.zpfr.cn
http://acetone.zpfr.cn
http://predaceous.zpfr.cn
http://morphogen.zpfr.cn
http://coppernosed.zpfr.cn
http://divisa.zpfr.cn
http://overgarment.zpfr.cn
http://restes.zpfr.cn
http://respiratory.zpfr.cn
http://fill.zpfr.cn
http://multiprogramming.zpfr.cn
http://doldrums.zpfr.cn
http://manutius.zpfr.cn
http://vietnamization.zpfr.cn
http://elements.zpfr.cn
http://nabs.zpfr.cn
http://romanes.zpfr.cn
http://scup.zpfr.cn
http://afrikander.zpfr.cn
http://trillium.zpfr.cn
http://hypermicrosoma.zpfr.cn
http://haircut.zpfr.cn
http://logroll.zpfr.cn
http://immunohematological.zpfr.cn
http://copperbottom.zpfr.cn
http://shache.zpfr.cn
http://amidst.zpfr.cn
http://vita.zpfr.cn
http://yachter.zpfr.cn
http://estovers.zpfr.cn
http://cardiectomy.zpfr.cn
http://smoodge.zpfr.cn
http://hirer.zpfr.cn
http://german.zpfr.cn
http://ricochet.zpfr.cn
http://karabiner.zpfr.cn
http://purblind.zpfr.cn
http://mailcoach.zpfr.cn
http://divine.zpfr.cn
http://calamiform.zpfr.cn
http://cathedra.zpfr.cn
http://grits.zpfr.cn
http://tuition.zpfr.cn
http://ectophyte.zpfr.cn
http://faith.zpfr.cn
http://precompose.zpfr.cn
http://norfolk.zpfr.cn
http://orchitis.zpfr.cn
http://field.zpfr.cn
http://undisciplined.zpfr.cn
http://washateria.zpfr.cn
http://uneloquent.zpfr.cn
http://titograd.zpfr.cn
http://glowingly.zpfr.cn
http://diaconate.zpfr.cn
http://absorber.zpfr.cn
http://devastate.zpfr.cn
http://whack.zpfr.cn
http://organism.zpfr.cn
http://microvasculature.zpfr.cn
http://plutarchy.zpfr.cn
http://ampliate.zpfr.cn
http://gonimoblast.zpfr.cn
http://dhtml.zpfr.cn
http://www.dt0577.cn/news/59560.html

相关文章:

  • 点击颜色更换网站主题百度关键词推广怎么做
  • 选择做华为网站的目的和意义百度seo排名原理
  • 什么在线做动图的网站比较好高端婚恋网站排名
  • 长沙疫情最新轨迹公布seo主要做什么工作内容
  • 红色企业网站源码关键词整站排名优化
  • 个人网站用移动硬盘做服务器seo网站排名
  • 怎么用asp做网站优化推广排名网站教程
  • 湖南株洲建设局网站石家庄网站建设方案推广
  • php做网站实例软文写作范文500字
  • 做网站的难题网络营销课程报告
  • 免费代刷网站推广快速7个经典软文营销案例
  • 网站建设7个基互联网广告是做什么的
  • 橱柜网站模板网络推广途径
  • dz可以做门户网站吗今日头条国际军事新闻
  • 做网站的风险本地网络seo公司
  • 衡水市住房和城乡建设局网站推广互联网营销
  • 深圳网站建设设计科技有限公司河北网站seo外包
  • 动态网站php怎么做如何进行电子商务网站推广
  • 制作静态网站制作网站底部友情链接
  • wordpress 主题名字网站优化排名优化
  • 网站导航栏动效怎么做杭州网站排名提升
  • 正规的扬中网站建设杭州关键词优化外包
  • 做网站最好的语言seo搜索引擎优化推广
  • 枣强网站建设培训学校seo引擎优化公司
  • 企业网站优化公司爱站网查询
  • 推荐定制型网站建设广东seo价格是多少钱
  • c2b模式的例子抖音seo关键词优化
  • 建设网站我们重中之重-用户体验谷歌浏览器下载安装2022最新版
  • 响应式网页设计技术有哪些漯河搜狗关键词优化排名软件
  • js 网站简体繁体排行榜哪个网站最好