我正在加载Lua脚本:
lua_State * L = lua_open();
luaL_openlibs(L);
const char lua_script[] = "function sum(a, b) return a+b; end print(\"_lua_\")";
int load_stat = luaL_loadbuffer(L,lua_script,strlen(lua_script),lua_script);
lua_pcall(L, 0, 0, 0);
现在我可以致电
lua_getglobal(L,"sum");
并在C面获得结果
但是,当我致电lua_pcall
时,会执行脚本并导致输出“ _lua _ ”到控制台。如果没有lua_pcall
,我以后无法访问lua_getglobal
。有没有办法解决?我不想在通过lua_pcall
设置“入口点”功能之前致电lua_getglobal
。
答案 0 :(得分:2)
如果您可以修改脚本,另一种方法是将初始化代码(print
及其他可能存在的内容)打包到一个单独的函数中,如下所示:
lua_State * L = lua_open();
luaL_openlibs(L);
const char lua_script[] = "function sum(a,b) return a+b end return function() print'_lua_' end";
int load_stat = luaL_loadbuffer(L,lua_script,strlen(lua_script),lua_script);
lua_pcall(L, 0, 1, 0); // run the string, defining the function(s)…
// also puts the returned init function onto the stack, which you could just leave
// there, save somewhere else for later use, … then do whatever you need, e.g.
/* begin other stuff */
lua_getglobal(L, "sum");
lua_pushinteger( L, 2 );
lua_pushinteger( L, 3 );
lua_pcall(L, 2, 1, 0);
printf( "2+3=%d\n", lua_tointeger(L,-1) );
lua_pop(L, 1);
/* end other stuff (keep stack balanced!) */
// and then run the init code:
lua_pcall(L, 0, 0, 0); // prints "_lua_"
现在,虽然您仍然需要运行块来定义函数,但是其他初始化代码将作为一个函数返回,您可以在以后/使用已修改的环境/ ...运行(或者根本不运行) ,如果你的情况不必要。)
答案 1 :(得分:1)
在运行脚本之前,函数sum
没有定义,因为函数定义是Lua中的赋值,需要执行它。
因此,无法避免运行定义sum
的脚本。这就是lua_pcall
的作用。您可以使用lua_call
,但之后您将无法处理错误。