下午好,
我正在开发一个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()。

09-08 05:02