Lua:加载文件后获取全局函数失败

Lua: getting global function failing after loading file

本文关键字:全局 函数 失败 获取 加载 文件 Lua      更新时间:2023-10-16

我试图调用一个名为test2.lua的lua文件中的函数这是test2.lua的内容:

function abc(path)
 t = {}
 table.insert(t, "a")
 return t
end

如您所见,它接受一个输入并返回一个字符串。

这是我的C代码。这很简单。然而,我的调用getglobal,以调用该函数不工作…当我测试它时,lua_getglobal说它不是一个函数…有什么原因吗?abc不应该是源文件内部可返回的全局函数吗?为什么这个全局变量只找到nil呢?
L = lua_open();
luaL_openlibs(L);
luaL_loadfile(L, "src/test2.lua");
lua_getglobal(L, "abc");
lua_pushstring(L, "coollll");
int error = 0;
if ((error = lua_pcall(L, 1, 1, 0)) == 0)
{
    std::cout << "cool";
}
编辑:

调用lua_getglobal导致我的程序破坏控制,无论使用loadfile或dofile…知道为什么吗?

lua_getglobal崩溃程序

函数luaL_loadfile()读取、解析和编译命名的Lua文件。它不执行任何内容。这在您的情况下很重要,因为语句function abc(path)end在执行前无明显效果。您所使用的function关键字相当于写

abc = function(path)  
  t = {}
  table.insert(t, "a")
  return t
end

在这种形式中,更清楚的是,在代码执行之前,名为abc的变量实际上没有被赋值。

luaL_loadfile()返回时,它已经将一个匿名函数推到Lua堆栈的顶部,这是编译文件的结果。您需要调用它,lua_pcall()将完成此操作。将您对luaL_loadfile()的引用替换为:

if (luaL_loadfile(L, "src/test2.lua") || lua_pcall(L, 0, LUA_MULTRET, 0)) {
    // do something with the error
} 

此时,test2。Lua已经被执行,它定义的任何函数或它修改的其他全局变量都是可用的。

这是一种非常常见的习惯用法,提供了luaL_dofile()函数来按名称加载和调用文件。

在您的代码中还有第二个更微妙的问题。函数abc()使用了一个名为t的变量,但是您应该注意,所使用的t是一个全局变量。你可能想把local t = {}写在abc()的上面。

调用luaL_loadfile是不够的:这会将一个块放到堆栈上。要么使用luaL_[p]call执行块(从而使函数可用),要么使用luaL_dofile