下午好,
我正在开发一个LUA / C++应用程序,我需要lua才能递归地调用其他lua代码,例如:C++调用lua函数,lua函数从另一个使用注册的C函数加载的字符串中调用另一个lua函数。在第一个lua函数开始时运行;
这是我要执行的步骤:
lua_State* state = luaL_newstate();
luaL_openlibs(state);
lua_register(state, "secondLua", secondLua);
lua_getfield( _luaState, LUA_GLOBALSINDEX, "init" );
lua_pcall( _luaState, 0, 0, 0 );
int secondLua(lua_State* state){
char* myString[128] = "function init2()\n io.write(\"hello\")\n end";
luaL_loadstring(pLuaState, myString);
lua_getfield(pLuaState,LUA_GLOBALSINDEX, "init2"); // function init2 declared on myString
lua_pcall(pLuaState, 0, LUA_MULTRET, 0);
//getting "attempt to call a nil value" here
return 0;
}
感谢您的帮助,其次,我想知道是否有一种方法可以将第二个函数命名为“init”以及第一个函数;
PS:我在LUAJIT上使用C++ 14和lua 5.1,我不能使用lua的dofile;
最佳答案
lua_loadstring()编译提供的源并将Lua块放在堆栈上。但是它不会执行,因此在您期望时仍未定义init2()。
用luaL_dostring()替换lua_loadstring()以实际运行该块并定义新的lua函数。或在lua_loadstring()之后立即调用lua_pcall()。实际上,luaL_dostring()确实可以做到这一点-lua_loadstring()后跟lua_pcall()。