使用LUA中使用后缺少的全局变量
Global variables missing after using require in lua
问题是," require"关键字清除了同一文件中定义的所有全局变量。
我正在从事C 项目。我使用lua 5.3。Lua脚本样式是:
1所有LUA代码都包含1个公共库文件,几个小文件都充当函数。
2启动程序时,LUA COONMO库将被编译和执行,将其全局变量留在LUA状态。然后未执行小文件。
3当程序到达某个时刻时,将调用相关的小LUA文件(就像我说的那样,每个小文件都是函数(。公共库中定义的全局函数和变量将在小LUA文件中使用。这就是为什么我在程序启动时编译和执行公共库的原因。
4我非常确定我只使用1个lua_state。
它运行良好,直到我决定将通用库将其分为多个文件,并在主文件中使用" require"。当程序启动时,主文件将被编译和执行。
没有更改单个代码,只需添加" require"。发生了奇怪的事情:缺少所有全局变量和全局功能。当在小lua文件中调用全局函数时,"称为nil值"错误会引起。
然后,我进行了一个实验,我在主库文件中删除了所有"需要"行,事实证明,主库中定义的全局函数效果很好。然后,我需要一个空文件" simple.lua",主要库中定义的全局函数丢失,无法从小lua文件调用。如何解释这一点?"需要"关键字如何清除同一文件中定义的所有全局变量?
在LUA库中:
require("simple")
function foo()
return 1+1
end
在lua小文件中
return foo()
结果:尝试调用零值(全局'foo'(
删除" require",lua库:
function foo()
return 1+1
end
结果:没有发生错误,返回2
C 侧代码:
lua common Library编译和concute:
int code = luaL_loadbuffer(L, s, strlen(s), "commonlib");
if(code != 0) {
std::string error = lua_tostring(L, -1);
lua_pop(L, 1);
return error;
}
code = lua_pcall(L, 0, 0, 0);
if(code > 0)
{
std::string ret = lua_tostring(L, -1);
lua_pop(L, 1);
return ret;
}
else
return ""; //empty string means no error
lua小功能文件编译:
int code = luaL_loadbuffer(L, s, strlen(s), "RULE1");
if(code != 0) {
std::string error = lua_tostring(L, -1);
lua_pop(L, 1);
return error;
}
else
{
return ""; //return empty means no error
}
两种代码中的L均为相同的LUA状态(或删除"要求"时它将无法使用(。编译后,堆栈顶部的小文件函数将保存在全局寄存器中,并带有参考变量" ref"。当调用lua小文件时,将裁判推入堆栈中,使用lua_pcall,没有什么特别的。
我自己解决了问题。由于重复的副本/糊状,LUA VM是第二次创建的。这是令人困惑的,因为如果没有"要求",一切都还好。这是一个完全巧合。
我从中学到的只是:始终仔细检查复制/粘贴代码。
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 当vector是tje全局变量时,c++中vector的内存管理
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 内联函数中具有内部链接的全局变量
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 全局变量 多读取器 一个写入器多线程安全?
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 不同作用域中的静态变量和全局变量
- C++ 在编译时具有函数计算全局变量
- 修改程序的入口点时未调用全局变量的构造函数
- 使用 std::ios_base::Init 正确初始化全局变量
- 为什么我的全局变量似乎没有变化?
- C ++程序如何返回我的数组或写入全局变量
- 为什么我的数组值与此处的全局变量不匹配?
- QT C++中对全局变量的未定义引用
- 通过require在不同的Lua状态之间共享全局变量
- 使用LUA中使用后缺少的全局变量
- 如何从C++中过滤掉Lua中用户定义的全局变量
- Lua、元表和全局变量
- c++lua设置全局变量时出错