全局变量访问(普通,表),函数调用(参数,返回值)
注意栈空间清理,防止内存泄露
访问普通全局变量
//需要在lua代码执行后执行 int LuaTestGlobal(lua_State* L) { lua_getglobal(L, "width"); int w = lua_tonumber(L, -1); lua_pop(L, 1); //恢复现场 printf("width = %d\n", w); return 0; } --lua width = 1010
设置普通全局变量
//需要在lua代码执行前执行 int LuaTestSetGlobal(lua_State* L) { lua_pushstring(L, "180"); lua_setglobal(L, "height"); return 0; } --lua print(height)
访问table全局变量
int LuaTestGetTableGlobal(lua_State* L) { lua_getglobal(L, "conf"); lua_getfield(L, -1, "titlename"); printf("titlename = %s\n", lua_tostring(L, -1)); lua_getfield(L, -2, "height"); printf("width = %.0f\n", lua_tonumber(L, -1)); lua_pop(L, 3); return 0; } --lua conf = { titlename = "screen", width = '1920' }
设置table全局变量
int LuaTestSetTableGlobal(lua_State* L) { lua_newtable(L); lua_pushstring(L, "name"); lua_pushstring(L, "my name is lzx"); lua_settable(L, -3); lua_pushstring(L, "age"); lua_pushnumber(L, 21); lua_settable(L, -3); lua_setglobal(L, "person"); return 1; } --lua print(person.name,person.age)
调用Lua函数
int LuaTestCallFunc(lua_State* L) { lua_getglobal(L, "event"); lua_pcall(L, 0, 0, NULL); return 0; } --lua function event() print('event called!') end
调用Lua函数 之 错误显示
int LuaTestCallFunc(lua_State* L) { lua_getglobal(L, "event1"); print_stack(L); if (lua_pcall(L, 0, 0, 0) != 0) { //如果不指明,则错误压至栈顶 printf("call event1 failed : %s\n", lua_tostring(L, -1)); lua_pop(L, 1); //恢复栈结构 } return 0; }
调用Lua函数 之 传参
int LuaTestCallFunc(lua_State* L) { lua_getglobal(L, "event"); lua_pushstring(L, "key"); if (lua_pcall(L, 1, 1, 0) != 0) { //如果不指明,则错误压至栈顶 printf("call event failed : %s\n", lua_tostring(L, -1)); lua_pop(L, 1); } else { printf("call event success : %s\n", lua_tostring(L, -1)); lua_pop(L, 1); } return 0; } --lua function event(typ) print('typ =' ..typ) return "lua event return" end
int LuaTestCallErrorHandling(lua_State* L) { int errfunc = lua_gettop(L); lua_getglobal(L, "ferror"); errfunc++; //自底向上索引的好处是,可以不用考虑新参数的加入从而导致函数位置的变化 lua_getglobal(L, "event1"); lua_pushstring(L, "key"); if (lua_pcall(L, 1, 1, errfunc) != 0) { //栈顶为ferror return的东西,倒数第二个是错误处理函数ferror printf("call event failed : %s\n", lua_tostring(L, -1)); lua_pop(L, 1); } else { printf("call event success : %s\n", lua_tostring(L, -1)); } lua_pop(L, 1); return 0; } --lua function ferror(e) print("error handling"); return "lua change error" end