lua 注册二级函数

添加lua模块一般是用到一级路劲下的函数。类似 math.sqrt(2)。

但有些场景下一个大模块下会有很多小模块,如下。

mod.mod0.fun(),mod.mod1.fun()

实现代码如下:

c

static int mod_fun(lua_State *L)
{
    return 0;
}


static const luaL_Reg mod0_lib[] =
{
    {"fun1", mod_fun},
    {"fun2", mod_fun},
    {"status",NULL},
    {NULL, NULL}
};
static const luaL_Reg mod2_lib[] =
{
    {"fun1", mod_fun},
    {"fun2", mod_fun},
    {"status",NULL},
    {NULL, NULL}
};
static const luaL_Reg module_lib[]=
{
    {"mod1",NULL},
    {"mod2",NULL},
    {"fun",mod_fun},
    {NULL,NULL},
};

static int luaopen_modlib(lua_State *L)
{
    //mod模块名称在执行函数前已压入栈中 栈地址 1

    luaL_newlib(L, module_lib); //创建table,当前栈地址为 2
   
    lua_newtable(L);//创建table 当前栈地址为3
    luaL_setfuncs(L,mod0_lib,0);//给table添加函数列表

    lua_pushinteger( L, 1002 );//顶部压栈整数 当前栈4
    lua_setfield( L, 3, "id" );//给mod0 table中id赋值栈顶数据并移除栈顶数据 当前栈3

    lua_setfield(L, 2, "mod1");//给mod table中mod1赋值为上栈顶table 并移除

    //当前栈顶为2 

    lua_newtable(L);
    luaL_setfuncs(L,mod2_lib,0);
    lua_pushinteger( L, 1003 );
    lua_setfield( L, 3, "id" );
    lua_setfield(L, 2, "mod2");

   //当前栈顶为2

    lua_pushinteger( L, 1001 );
    lua_setfield( L, 2, "id" );

   //栈顶为2 

   //退出时必须保证栈顶table不变  关联函数luaL_requiref就可以知道原因

    return 1;
}

 lua代码

for k, v in pairs(module) do
    if type(v) == "table" then
        print(k, ".................")
        for k0, v0 in pairs(v) do
            print("", k0, v0)
        end
    else
        print(k, v)
    end
end

执行结果

mod2	.................
	fun1	function: 080226ab
	status	false
	id	1003
	fun2	function: 080226ab
fun	function: 080226ab
id	1001
mod1	.................
	fun1	function: 080226ab
	status	false
	id	1002
	fun2	function: 080226ab

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值