Lua - pcall与“切入点”

时间:2017-04-13 18:10:06

标签: c lua

我正在加载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

2 个答案:

答案 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,但之后您将无法处理错误。