lua
2019-11-19 18:29:17

lua入门教程:C API 另一种注册方式

29 / 0 / 0 / 0

还有另外一种往lua中注册函数的方法,直接把函数编译在dll或者so中,当require "xx"后就会自动的加载dll中的函数,注册到lua中去,看下我们是如何加载这一个过程的。

tbLib.h

#ifndef _TBLIB_H
#define _TBLIB_H

#ifdef __cplusplus
extern "C" {
#endif

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

#ifdef TBLIB_EXPORTS
#define TBLIB_EXPORTS __declspec(dllexport) 
#else
#define TBLIB_EXPORTS __declspec(dllimport)
#endif

// 全局的函数,用于导出,内部完成注册和初始化功能
TBLIB_EXPORTS int luaopen_tbLib(lua_State *L);

#ifdef __cplusplus
}
#endif
#endif

这里导出luaopen_tbLib函数,这个函数在lua中require "xx"后会自动的加载,看看luaopen_tbLib做了哪些事情。

tbLib.c

#include <stdio.h>
#include "tbLib.h"

static int test(lua_State *L)
{
    printf("abc");
    lua_pushnumber(L, 10);

    return 1;
}

static const struct luaL_Reg myLib[] = 
{
    {"test", test},
    {NULL, NULL}
};

int luaopen_tbLib(lua_State *L)
{
    luaL_register(L, "tbLib", myLib);
    return 1; // 把表压入了栈中,所以就需要返回1
}

同样的我们看看luaL_register中做了什么事情。

lauxlib.h中,定义着luaL_register为:

#define luaL_register(L,n,l)    (luaL_openlib(L,(n),(l),0))

可以在继续跟进 luaL_openlib,可以发现做的事情也是把函数压入的栈中,然后进行设置变量值,并它表的名字命名为我们所取的函数名。

可以这样来调用lua代码:

require "testLib"
local a = testLib.test()
print(a)

在这里a的变量为 10。

PS: 如本文对您有疑惑,可加QQ:1752338621 进行讨论。

0 条评论

0
0
官方
微信
官方微信
Q Q
咨询
意见
反馈
返回
顶部