注册c模块到lua中使用

news/2025/10/10 16:12:47/文章来源:https://www.cnblogs.com/Cxiangyang/p/19133262

#define REGISTER_CUSTOM_LIBRARY(name, lua_c_fn) \
int lua_c_fn(lua_State*); \
luaL_requiref(L, name, lua_c_fn, 0); \
lua_pop(L, 1) /* remove lib */

//注册c模块
void open_custom_libs(lua_State* L) {
//core
REGISTER_CUSTOM_LIBRARY("moon.core", luaopen_moon_core);

}

//c模块中的函数

int LUAMOD_API luaopen_moon_core(lua_State* L) {luaL_Reg l[] = { { "clock", lmoon_clock },{ "md5", lmoon_md5 },{ "tostring", lmoon_tostring },{ "timeout", lmoon_timeout },{ "log", lmoon_log },{ "loglevel", lmoon_loglevel },{ "cpu", lmoon_cpu },{ "send", lmoon_send },{ "new_service", lmoon_new_service },{ "kill", lmoon_kill },{ "scan_services", lmoon_scan_services },{ "queryservice", lmoon_queryservice },{ "next_sequence", lmoon_next_sequence },{ "env", lmoon_env },{ "server_stats", lmoon_server_stats },{ "exit", lmoon_exit },{ "now", lmoon_now },{ "adjtime", lmoon_adjtime },{ "callback", lua_service::set_callback },{ "decode", message_decode },{ "redirect", message_redirect },{ "collect", lmi_collect },{ "escape_print", escape_print },{ "signal", moon_signal },/* placeholders */{ "id", NULL },{ "name", NULL },{ "timezone", NULL },{ NULL, NULL } };luaL_newlib(L, l);const lua_service* S = lua_service::get(L);lua_pushinteger(L, S->id());lua_setfield(L, -2, "id");lua_pushlstring(L, S->name().data(), S->name().size());lua_setfield(L, -2, "name");lua_pushinteger(L, moon::time::timezone());lua_setfield(L, -2, "timezone");return 1;
}

上边代码是moon框架中注册core模块的操作,可以看出主要是调用了luaL_requiref和lua_pop。luaL_requiref会在LOADED表中查找key为modname的值是否存在,不存在就调用lua_call执行传入的openf函数(luaopen_moon_core),最后调用lua_pop弹出栈上的LOADED表。

image

 luaopen_moon_core又干了什么事情呢,查看源码可以发现调用了luaL_newlib创建一个表(根据luaL_Reg数组)key和value分别对应字符串和注册的函数。

有趣的是,moon还添加了额外的字段到表中,代码如下:

image

 

lua_pushinteger(L, S->id());    //栈顶压入int值
lua_setfield(L, -2, "id");      //在-2位置的表中(luaL_newlib创建在栈上的),向表中插入元素(key为“id”,value为栈顶元素t["id"]=value,然后弹出int值,需要注意这里弹出只是移动了栈指针,并不会清空元素,因为栈元素其实是一个union+类型枚举,所以可以复用栈元素(即使下次push的不是int值也无所谓,tt_和value_会设置对应的值)

企业微信截图_1760083066120

 

结论:

注册moon.core模块完成后,LOADED表的内容格式如下:

image

 在lua中使用模块:

-- 当用户执行 require "moon.core" 时
local moon = require "moon.core"-- 此时 moon 变量指向 package.loaded["moon.core"] 表
print(moon.id)        -- 访问特殊字段
print(moon.name)
print(moon.timezone)-- 调用函数
local t = moon.clock()  -- 调用 lmoon_clock 函数
local hash = moon.md5("hello")  -- 调用 lmoon_md5 函数

 

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

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

相关文章

S3Bucket安全评分与合规状态逻辑修复:全面提升云存储安全评估准确性 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

DNA权威书籍

《基因XII》- 本杰明卢因分子生物学“圣经”。 这是全球最经典、最权威的分子生物学教材,每隔几年就会更新一版。内容极其全面、系统,从DNA结构、复制、转录、翻译到基因调控、基因组学、新技术都有详尽的阐述。插图…

220V转5V500mA非隔离电源芯片WT5105

220V转5V500mA非隔离电源芯片WT5105 WT5105 是一款集成非隔离式电源控制器,可将 220V 电压转换为 5V、500mA 的稳定输出,为低功率设备提供稳定、高效的供电解决方案。以下是其相关介绍:核心参数:输出电压为 5V,输…

linux基础-find查找

linux基础-find查找 1.认识 实时查找工具,通过便利指定路径完成文件的查找工作特点:(1)精确查找(2)实时查找(3)查找速度慢(4)可能之搜索用户具备读取和执行权限的目录语法 :   find [OPTION]... [查找路径…

220V转12V电机水泵供电驱动WT5105

220V转12V电机水泵供电驱动WT5105 WT5105是一款AC-DC开关电源驱动芯片,适用于220V转12V的电机水泵应用。以下是详细介绍:基本参数输入电压:85V~265V AC(覆盖220V市电)输出电压:可调,支持12V输出输出功率:5V-15…

ansys安装时无法修改安装路径--灰色无法修改

ansys安装时无法修改安装路径,是因为有ansys程序运行、曾经安装没有卸载干净 1、卸载 2、清除注册表(工具) 3、参考官方方法 Uninstalling the Ansys license manager – Ansys Optics以下是官网卸载方法 Uninstall…

Qwen2.5-VL技术报告

原文:https://mp.weixin.qq.com/s/IbfY50w_w27WO3ZzRSsyDg 全文摘要Qwen2.5-VL模型在视觉语言系列中具有显著的基础能力和创新功能上的提升。通过增强的视觉识别、精确的对象定位、稳健的文档解析和长视频理解等能力,…

智能提取表格从pdf, 图片 到 excel, csv

智能提取表格从pdf, 图片 到 excel, csvhttps://www.textin.com/

攸米知识付费小程序管理系统:一站式知识变现解决方案

在数字化浪潮推动下,知识付费成为教育、培训及内容创作领域的重要变现模式。攸米知识付费小程序系统依托微擎生态,为用户提供微信小程序端知识付费平台搭建服务,涵盖课程管理、会员体系、营销工具、订单处理等全流程…

citus设置密码

给citus集权设置密码 用户名: luozhengkang 密码:xiaoluo 数据库:mdmaster_prod-- 创建用户 CREATE USER luozhengkang WITH PASSWORD xiaoluo NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN CONNECTION LIMIT…

实践与认识及其发展规律

摆脱贫困首要并不是摆脱物质的贫困,而是摆脱意识和思路的贫困 告诉我们 实践主体的能力即包括自然能力,也包括精神能力 实践主体:指具有一定的主体能力,从事现实社会实践活动的人 实践主体的能力:包括自然能力和精…

2025 年最新推荐氨糖厂家排行榜:四期临床验证 + 蓝帽认证,帮你选出优质氨糖软骨素 / 氨糖钙 / 氨糖钙片厂家

当前,人口老龄化加剧使中老年群体对骨健康重视度飙升,氨糖作为关节健康守护关键成分,市场需求急剧增加。然而,氨糖市场乱象丛生,大量品牌缺乏核心研发能力,产品配方同质化严重,无法满足不同人群个性化骨健康需求…

完整教程:阿里云瓴羊发布企业级AI智能体服务平台AgentOne,成就AI时代的“超级公司”

完整教程:阿里云瓴羊发布企业级AI智能体服务平台AgentOne,成就AI时代的“超级公司”pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; …

利用MCP Server革新软件测试:更智能、更高效的自动化

在当今快速迭代的软件开发环境中,传统测试方法正面临前所未有的挑战。本文将介绍如何借助MCP Server这一创新技术,彻底改变软件测试的工作流程,实现更智能、更高效的自动化测试。 为什么测试需要MCP Server? 传统自…

数据结构-设计一个算法删除单链表L(有头节点)中的最小结点。

数据结构 设计一个算法删除单链表L(有头节点)中的最小结点。 /**************************************************************************** * @name LkListDelMin* @brief 删除单链表中的最小结点* @pa…

可视化图解算法63:单词搜索

对于数据结构笔试面试算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。LeetCode 79. 单词搜索1. 题目 描述 给定一个 m x n 二维字符网格 …

云原生docker离线二进制安装 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

AI大模型应用实践 八:如何通过RAG数据库实现大模型的私有化定制与优化

在大模型的应用中,如何实现知识的动态更新与私有化定制化,是许多企业亟需解决的挑战。大模型的知识源自预训练,因此一旦完成训练,它所掌握的知识就无法再更新。如何让大模型不断学习新知识,是行业中的一大难题。幸…

ARM芯片架构之CoreSight高效的系统架构规范

ARM芯片架构之CoreSight高效的系统架构规范2025-10-10 15:29 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: blo…