luaL_openlib

LUALIB_API void (luaL_openlib) (lua_State *L, const char *libname, const luaL_Reg *l, int nup);

 


libname不为NULL, nup>0时

  a) libname不为NULL, 则创建一个table(lib_obj), 函数注册在lib_obj下,lib_obj存放在[LUA_GLOBALSINDEX][libname]下(LUA_GLOBALSINDEX对应lua中的_G)

  b1) nup为1时: 栈顶元素存入LUA_GLOBALSINDEX-1处, 不会出栈

  b2) nup>1时: 栈[-nup]存入LUA_GLOBALSINDEX-1处, 栈[-nup+1]存入LUA_GLOBALSINDEX-2处, 以此类推, 栈顶弹出nup-1个元素

 

MyLuaLib.c

static int calc(lua_State *L) {
    printf("calc 1: %d\n", lua_gettop(L));
    printf("calc 2: [%d]: %s\n", lua_upvalueindex(1), lua_tostring(L, lua_upvalueindex(1)));
    printf("calc 3: [%d]: %s\n", lua_upvalueindex(2), lua_tostring(L, lua_upvalueindex(2)));
    lua_Number op1 = luaL_checknumber(L, 1);
    lua_Number op2 = luaL_checknumber(L, 2);
    lua_Number result = op1 + op2;
    lua_pushnumber(L, result);
    return 1; //1个返回值
}

static const struct luaL_Reg mylibs[] = {
    {"calc", calc},
    {NULL, NULL},
};

LUALIB_API int luaopen_MyLuaLib(lua_State *L) {
    printf("luaopen1: %d\n", lua_gettop(L)); //栈上有1个元素
    lua_pushstring(L, "test");
    lua_pushstring(L, "test2");
    printf("luaopen2: %d\n", lua_gettop(L)); //栈上有3个元素
    luaL_openlib(L, "MyLuaLib", mylibs, 2); //2表示可以访问2个upvalue
    printf("luaopen3: %d\n", lua_gettop(L));

    return 1; //require的返回值数量
}

 

temp.lua

local function Test()
    local MyLuaLib = require("MyLuaLib")
    local result = MyLuaLib.calc(1, 2)
    print("lua: Test 1", result)
    print("lua: Test 2", _G.MyLuaLib)
end

Test()

 

lua代码运行后

 

 


libname为NULL, nup为0时

a) libname为NULL, 则不创建table, 将函数注册在当前栈顶元素下

 

MyLuaLib.c

static int GetGField(lua_State *L) {
    printf("GetGField1: %d\n", lua_gettop(L));
    char const* fieldName = lua_tostring(L, 1);
    lua_getfield(L, LUA_GLOBALSINDEX, fieldName);
    return 1;
}

static const struct luaL_Reg mylibs[] = {
    {"GetGField", GetGField},
    {NULL, NULL},
};

LUALIB_API int luaopen_MyLuaLib(lua_State *L) {
    printf("luaopen1: %d\n", lua_gettop(L));
    lua_pushvalue(L, LUA_GLOBALSINDEX); //将_G压入栈顶 (LUA_GLOBALSINDEX对应lua中的_G)
    printf("luaopen2: %d\n", lua_gettop(L));
    luaL_openlib(L, NULL, mylibs, 0); //将函数注册在栈顶元素下(即: _G)
    printf("luaopen3: %d\n", lua_gettop(L));

    return 1; //require的返回值数量
}

 

temp.lua

local function Test()
    require("MyLuaLib")
    local result = _G.GetGField("GetGField")
    print("lua: Test 1", result)
    print("lua: Test 2", _G.GetGField)
end

Test()

 

lua代码运行后

 

posted @ 2025-03-12 23:12  yanghui01  阅读(99)  评论(0)    收藏  举报