Lua:加载文件后获取全局函数失败
Lua: getting global function failing after loading file
我试图调用一个名为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
。
相关文章:
- 全局函数参数
- 如何定义全局函数指针并分配给特定地址
- 为什么全局函数 void showA(A&x) 能够访问 A 类的私有成员?
- 为什么链接器报告全局函数的乘法定义符号,而不是类静态方法
- CUDA 全局函数未正确添加某些索引的数组值
- Qt - 定义 QML 的全局函数
- 如何在全局函数中访问链表的头部和尾部
- 如何在 c++ 中的全局函数中调用类的对象
- 类方法和全局函数中的别名
- 在C 中将全局函数包括在命名空间中
- 用于定义全局函数"using namespace"
- 为什么在 2 个不同的 cpp 文件中定义内联全局函数会导致神奇的结果
- 使用 lambda 和全局函数调用 ranges::for_each
- Djinni 能否从C++全局函数中生成必要的代码
- 当在Python中定义__str__时,如何将C 的标准全局函数覆盖
- 有没有一种方法可以使全局函数/静态成员函数一次可呼出
- 为什么我不能在头文件中定义全局函数
- 为什么 std::get<T> for 'variant' 是一个全局函数?
- 从C源文件调用C++源文件中定义的全局函数
- 是否可以通过引用将方法从类传递到全局函数或在类之间传递?