当前位置: 首页 > 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.sczhlp.com/news/182257/

相关文章:

  • DNA权威书籍
  • 220V转5V500mA非隔离电源芯片WT5105
  • linux基础-find查找
  • 门户网站是什么意思?做网站为什么需要购买域名
  • 遵义原创网站东莞建设工程交易中心官网
  • 免费做期中考试的网站网站集约化建设的问题
  • 技术支持:上海网站建设怎么做整人的网站
  • 名创 网站建设商标注册网站官网
  • 视频解析网站建设如何在自己建设的网站上发表文章
  • 做网站用方正字体可以额的网站建设案例行情
  • 苏州h5模板建站公司管理流程
  • 荷城网站制作1m带宽做网站怎么样
  • 做低价的跨境电商网站东莞东城招聘网最新招聘
  • c2c电子商务网站建设栏目结构图北京建站优化
  • 怎么获取免费的网站域名一条龙网站
  • 网站建设罗贤伟wordpress表情包
  • 免费做初中试卷的网站justnews主题wordpress
  • 有域名有服务器怎么建站网站建设银行业务预约纪念币猪年纪念币预约
  • 攸米知识付费小程序管理系统:一站式知识变现解决方案
  • citus设置密码
  • 实践与认识及其发展规律
  • 2025 年最新推荐氨糖厂家排行榜:四期临床验证 + 蓝帽认证,帮你选出优质氨糖软骨素 / 氨糖钙 / 氨糖钙片厂家
  • 个人网站备案备注写什么营销案例100例小故事及感悟
  • 淘宝上做网站行吗seo网站建设优化什么意思
  • 网站框架搭建途牛的旅游网站是谁做的
  • 大连建设网站哪家好网站建设服务有哪些内容
  • 国内什么网站用asp.net域名com和cn的区别
  • 查外链网站淘宝店铺不允许发布网站建设了
  • 怎么判断网站开发语言众志seo
  • 汽车设计网站大全南宁工程造价建设信息网站