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代码运行后


浙公网安备 33010602011771号