Lua C++编程 之 c++调用Lua

全局变量访问(普通,表),函数调用(参数,返回值)
注意栈空间清理,防止内存泄露

访问普通全局变量

//需要在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

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

大纲

Share the Post:
滚动至顶部