lua可以通過與C函數(shù)相互調用來擴展程序功能,在C中嵌入lua腳本既可以讓用戶在不重新編譯代碼的情況下修改lua代碼更新程序,也可以給用戶提供一個自由定制的接口,這種方法遵循了機制與策略分離的原則。在lua中調用C函數(shù)可以提高程序的開發(fā)效率,lua與C的相互調用在工程中相當實用。
lua和c之間的相互是通過一個抽象的棧來進行交互的。

1. lua和c相互調用的api:
todo
2. 應用
這種lua和c相互調用的方式,可以實現(xiàn)一下很方便的功能。把lua腳本作為功能插件,配置化的植入到cpp的程序中。比如在游戲中,使用某個道具可以給角色加經(jīng)驗,可以把addexp(100)這段lua代碼作為配置,當使用道具的時候,就通過cpp調用這段lua去執(zhí)行。 >完整實例代碼
int exec_buff(ACTOR * actor)
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);
// 將指定的函數(shù)注冊為Lua的全局函數(shù)變量,其中第一個字符串參數(shù)為Lua代碼
// 在調用C函數(shù)時使用的全局函數(shù)名,第二個參數(shù)為實際C函數(shù)的指針。
lua_register(L, "addexp", addexp);
lua_env_set(actor);
// 在注冊完所有的C函數(shù)之后,即可在Lua的代碼塊中使用這些已經(jīng)注冊的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