在不执行脚本的情况下调用 Lua 函数。

我正在将Lua嵌入到C/C++应用程序中。有没有一种方法可以在不先执行整个脚本的情况下从C/C++调用Lua函数?

我尝试过这样做:

//从C/C++程序调用lua脚本
luaL_loadfile(L,"hello.lua");

//从C/C++程序调用lua函数
lua_getglobal(L,"bar");
lua_call(L,0,0);

但是它给了我这个:

PANIC: 在调用Lua API时出现未受保护的错误(尝试调用空值)

我只能在这样做时调用bar():

//从C/C++程序调用lua脚本
luaL_dofile(L,"hello.lua");  //这会执行一次脚本,我不喜欢

//从C/C++程序调用lua函数
lua_getglobal(L,"bar");
lua_call(L,0,0);

但是它给了我这个:

hello
stackoverflow!!

我要的是这个:

stackoverflow!

这是我的lua脚本:

print("hello");

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

原文链接 https://stackoverflow.com/questions/2346060

点赞
stackoverflow用户258523
stackoverflow用户258523

正如在freenode的#lua频道中刚刚讨论的那样,luaL_loadfile只是将文件编译为可调用的块,在那时,文件内部的任何代码都没有运行(包括函数定义)。因此,为了让bar的定义执行,必须调用该块(这就是luaL_dofile的作用)。

2010-02-27 03:47:46
stackoverflow用户274904
stackoverflow用户274904

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

2010-02-27 03:49:04
stackoverflow用户3688091
stackoverflow用户3688091

一个可能的解决方案/黑科技(请注意我目前无法测试)...


在你的 LUA 代码的顶部插入一个占位符“return;”行。

  • 将你的文件加载到一个字符串中(就像你准备使用luaL_loadstring()一样)
  • 现在,使用printf_s("return;\r\n%s", [指向实际LUA代码的字符串指针])就可以简单地使用了
  • 现在,您可以对连接后的字符串使用luaL_loadstring()

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


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

2016-06-02 08:35:04