调用Lua函数而不执行脚本

8
我将Lua嵌入C/C++应用程序中。是否有办法在不先执行整个脚本的情况下从C/C++调用Lua函数?
我尝试过以下方法:
//call lua script from C/C++ program
luaL_loadfile(L,"hello.lua");

//call lua function from C/C++ program
lua_getglobal(L,"bar");
lua_call(L,0,0);

但是它给了我这个:
PANIC: unprotected error in call to Lua API (attempt to call a nil value)

只有当我这样做时才能调用bar():

//call lua script from C/C++ program
luaL_dofile(L,"hello.lua");  //this executes the script once, which I don't like

//call lua function from C/C++ program
lua_getglobal(L,"bar");
lua_call(L,0,0);

但它给我这个:

hello
stackoverflow!!

我希望你能为我提供以下服务:

stackoverflow!

这是我的Lua脚本:
print("hello");

function bar()
 print("stackoverflow!");
end

1
由于您必须运行脚本才能让Lua VM看到它,就像Etan所指示的那样,您需要将function bar()提取到另一个文件中并仅运行该文件。 - greatwolf
3个回答

15

刚才在freenode的#lua频道中讨论了这个问题。luaL_loadfile只是将文件编译为可调用的块,此时文件内的代码(包括函数定义)都没有运行。因此,为了执行bar的定义,必须调用该块(这就是luaL_dofile所做的事情)。


我是在聊天中提出这个问题的人 :P - Person
我想你是这样想的,但无论如何,为了避免误解,我还是明确地提出了这个参考。 - Etan Reisner

1
发现必须运行脚本才能调用函数。

0

一种可能的解决方案/黑客方法(请注意,我目前无法测试)...


在你的LUA代码顶部插入一个虚拟的"return;"行。

  • 将文件加载到字符串中(就像为使用luaL_loadstring()做准备一样)
  • 现在只需要使用printf_s("return;\r\n%s", [指向实际LUA代码的字符串指针])
  • 现在可以将连接后的字符串luaL_loadstring()

代码仍然会执行,但它应该在实际执行任何操作之前被截断(在你的print("hello");示例中,打印行将变得不可达)。它应该仍然更新了所有函数原型的列表,现在您应该能够使用lua_get()引用这些函数。


注意:对于那些不知道的人,"\r\n"是代表Windows操作系统上换行符的转义代码,而且必须是这些斜杠...即:这个\r\n,而不是这个/r/n


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接