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

C++ Lua:加载文件后获取全局函数失败,c++,lua,C++,Lua,我试图在名为test2.lua的lua文件中调用一个函数 这是test2.lua的内容: function abc(path) t = {} table.insert(t, "a") return t end 正如您所看到的,它接受单个输入并返回一个字符串 这是我的C代码。这很简单。但是,为了调用该函数而调用getglobal不起作用。。。lua_getglobal说当我测试它时它不是一个函数。。。为什么会这样?abc不应该是源文件内部可返回的全局函数吗?那么,为什么在这个全球范围内只发

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

function abc(path)
 t = {}
 table.insert(t, "a")
 return t
end
正如您所看到的,它接受单个输入并返回一个字符串

这是我的C代码。这很简单。但是,为了调用该函数而调用getglobal不起作用。。。lua_getglobal说当我测试它时它不是一个函数。。。为什么会这样?abc不应该是源文件内部可返回的全局函数吗?那么,为什么在这个全球范围内只发现零呢

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";
}
L=lua_open();
luaL_openlibs(L);
luaL_加载文件(L,“src/test2.lua”);
lua_getglobal(L,“abc”);
lua_推进管柱(L,“COOLLL”);
整数误差=0;
如果((错误=lua_pcall(L,1,1,0))==0)
{

std::cout调用
luaL\u loadfile
是不够的:这会将一个块放到堆栈上。可以使用
luaL\u[p]调用执行该块(从而使函数可用),或者使用
luaL\u dofile
函数
luaL\u loadfile()
读取、解析和编译命名的Lua文件。它不会执行其任何内容。这在您的情况下很重要,因为语句
函数abc(path)
end
在执行之前没有可见的效果。您使用的
函数
关键字等同于编写

abc = function(path)  
  t = {}
  table.insert(t, "a")
  return t
end
在这种形式中,更清楚的是,名为
abc
的变量在代码执行之前实际上没有赋值

luaL\u loadfile()
返回时,它已在编译文件后的Lua堆栈顶部推送了一个匿名函数。您需要调用它,而
Lua\u pcall()
将执行此操作。将对
luaL\u loadfile()的引用替换为以下内容:

if (luaL_loadfile(L, "src/test2.lua") || lua_pcall(L, 0, LUA_MULTRET, 0)) {
    // do something with the error
} 
此时,test2.lua已经执行,它定义的任何函数或它修改的其他全局变量都可用

这是一个非常常见的习惯用法,即提供函数
luaL\u dofile()
以按名称加载和调用文件


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

好的。所以我很理解在代码执行之前必须先运行文件才能访问函数的概念。一切都很好。我将loadfile更改为dofile。但是我有一个新问题。我可能会为此创建一个新问题,但lua_getglobal正在崩溃。无论使用loadfile还是dofi,都会发生这种情况le,当调用lua_getglobal(L,“trans”)时,它在luaS_newlstr中崩溃…在调用getfield之后…:/