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

注册c模块到lua中使用

#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.zskr.cn/news/18216.html

相关文章:

  • S3Bucket安全评分与合规状态逻辑修复:全面提升云存储安全评估准确性 - 详解
  • DNA权威书籍
  • linux基础-find查找
  • Qwen2.5-VL技术报告
  • 攸米知识付费小程序管理系统:一站式知识变现解决方案
  • 利用MCP Server革新软件测试:更智能、更高效的自动化
  • 数据结构-设计一个算法删除单链表L(有头节点)中的最小结点。
  • 可视化图解算法63:单词搜索
  • AI大模型应用实践 八:如何通过RAG数据库实现大模型的私有化定制与优化
  • 【完结11章】基于Golang+Gin+Gorm+Vue3母婴商城项目实战
  • 25-1010 从房间回声看懂离散卷积原理
  • (13)ASP.NET Core2.2 中的选项模式(Options) - 教程
  • 印度尼西亚股票实时数据API对接文档
  • 20232304 2025-2026-1 《网络与系统攻防技术》实验一实验报告
  • lsh 的源码注释(1)
  • Codeforces Round 1056 (Div. 2) A~D
  • 某中心在旧金山设立AGI实验室专注长期AI研究
  • 微算法科技(NASDAQ:MLGO)开发延迟和隐私感知卷积神经网络分布式推理,助力可靠人工智能系统技术
  • 不止节能,更能 “生钱”:MyEMS 辅助企业参与电力现货市场的实操案例
  • 当能耗监控变 “游戏”:MyEMS 可视化看板如何让员工主动参与节能?
  • 从小时级到分钟级:多点DMALL如何用Apache SeaTunnel把数据集成成本砍到1/3?
  • 2025 最新隔音棉生产厂家口碑推荐榜:甄选实力与品质兼具的品牌,含西南 / 昆明高性价比厂商最新推荐防火墙/内衬/鸡蛋/聚酯纤维/装修/吊顶隔音棉厂家推荐
  • 2025 年高强钢板厂家最新推荐排行榜:聚焦国内优质企业,涵盖多型号产品,助力工业采购精准选型Q550D/合金/HG785D/ Q690D/S960QL/700L高强钢板厂家推荐
  • 2025 升降杆厂家TOP 榜:梁山信达恒泰,专注多领域设备供应,气动型升降杆源头厂家推荐!
  • 2025 年最新推荐耐磨钢板生产厂家排行榜:涵盖高锰 / 堆焊 / 双金属 / NM 系列及无磁类型,解决采购难题助力企业选高性价比品牌
  • 苹果群控系统的游戏运营 - 详解
  • 完整教程:云原生网关Higress介绍与部署指南
  • 2025 年最新推荐!涵盖系统智能断桥窄边等多类型铝门窗厂家榜单,优秀生产厂家实力盘点智能/断桥/窄边/定制/全景/阳光房/隐框铝门窗厂家推荐
  • (六)重构的艺术:简化困难条件逻辑的秘诀
  • 故障诊断:奇怪的ORA-01000故障处理