lua可以通过与C函数相互调用来扩展程序功能,在C中嵌入lua脚本既可以让用户在不重新编译代码的情况下修改lua代码更新程序,也可以给用户提供一个自由定制的接口,这种方法遵循了机制与策略分离的原则。在lua中调用C函数可以提高程序的开发效率,lua与C的相互调用在工程中相当实用。
lua和c之间的相互是通过一个抽象的栈来进行交互的。
1. lua和c相互调用的api:
todo
2. 应用
这种lua和c相互调用的方式,可以实现一下很方便的功能。把lua脚本作为功能插件,配置化的植入到cpp的程序中。比如在游戏中,使用某个道具可以给角色加经验,可以把addexp(100)
这段lua代码作为配置,当使用道具的时候,就通过cpp调用这段lua去执行。 >完整实例代码
int exec_buff(ACTOR * actor)
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);
// 将指定的函数注册为Lua的全局函数变量,其中第一个字符串参数为Lua代码
// 在调用C函数时使用的全局函数名,第二个参数为实际C函数的指针。
lua_register(L, "addexp", addexp);
lua_env_set(actor);
// 在注册完所有的C函数之后,即可在Lua的代码块中使用这些已经注册的C函数了。
if (luaL_dostring(L, actor->lua_str.c_str()))
{
printf("Failed to invoke.\n");
}
lua_env_unset();
lua_close(L);
printf("actor exec lua buff end \n");
return 0;
}
int main()
{
ACTOR * actor = new ACTOR();
actor->lua_str = "addexp(100)";
actor->exp = 5;
actor->id = 10000;
exec_buff(actor);
return 0;
}
// g++ -g -I${dependencies_include_path}/lua-5.1.4/src -L ${dependencies_lib_path} -llua -Wl,-rpath=${dependencies_lib_path} 5.cpp -o test5
参考:
https://www.cnblogs.com/coderkian/p/4057750.html
https://juejin.cn/post/6995343033977798670