lua可以通過(guò)與C函數(shù)相互調(diào)用來(lái)擴(kuò)展程序功能卖宠,在C中嵌入lua腳本既可以讓用戶(hù)在不重新編譯代碼的情況下修改lua代碼更新程序乍炉,也可以給用戶(hù)提供一個(gè)自由定制的接口抡锈,這種方法遵循了機(jī)制與策略分離的原則怜珍。在lua中調(diào)用C函數(shù)可以提高程序的開(kāi)發(fā)效率渡紫,lua與C的相互調(diào)用在工程中相當(dāng)實(shí)用到推。
lua和c之間的相互是通過(guò)一個(gè)抽象的棧來(lái)進(jìn)行交互的。
1. lua和c相互調(diào)用的api:
todo
2. 應(yīng)用
這種lua和c相互調(diào)用的方式惕澎,可以實(shí)現(xiàn)一下很方便的功能莉测。把lua腳本作為功能插件,配置化的植入到cpp的程序中唧喉。比如在游戲中捣卤,使用某個(gè)道具可以給角色加經(jīng)驗(yàn),可以把addexp(100)
這段lua代碼作為配置八孝,當(dāng)使用道具的時(shí)候董朝,就通過(guò)cpp調(diào)用這段lua去執(zhí)行。 >完整實(shí)例代碼
int exec_buff(ACTOR * actor)
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);
// 將指定的函數(shù)注冊(cè)為L(zhǎng)ua的全局函數(shù)變量干跛,其中第一個(gè)字符串參數(shù)為L(zhǎng)ua代碼
// 在調(diào)用C函數(shù)時(shí)使用的全局函數(shù)名子姜,第二個(gè)參數(shù)為實(shí)際C函數(shù)的指針。
lua_register(L, "addexp", addexp);
lua_env_set(actor);
// 在注冊(cè)完所有的C函數(shù)之后楼入,即可在Lua的代碼塊中使用這些已經(jīng)注冊(cè)的C函數(shù)了哥捕。
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