c++lua设置全局变量时出错

c++ lua error on setting global variable

本文关键字:出错 全局变量 设置 c++lua      更新时间:2023-10-16

我有以下代码:

lua_State *lua;
lua = lua_open();
luaL_openlibs(lua);
std::string code = "print(gvar)n"
    "function test()n"
    "print(gvar)n"
    "endn";
if(!luaL_loadstring(lua, code.c_str())){
    if (lua_pcall(lua, 0, 0, 0)){
        const char* error = lua_tostring(lua, -1); 
        lua_pop(lua, 1);
    }
}
lua_pushstring(lua, "100");
lua_setglobal(lua, "gvar");
if (lua_pcall(lua, 0, 0, 0)){
    const char* error = lua_tostring(lua, -1); // returns "attempt to call a nil value"
    lua_pop(lua, 1);
}
lua_close(lua);

调用函数和获取全局变量很好,但当我尝试设置全局变量时,我会得到"尝试调用零值"。我不明白为什么?

if(!luaL_loadstring(lua, code.c_str())){
    if (lua_pcall(lua, 0, 0, 0)){
        const char* error = lua_tostring(lua, -1); 
        lua_pop(lua, 1);
    }
}

此代码使用luaL_loadstring()将字符串加载到一个匿名函数中,将其放入堆栈中,然后使用lua_pcall(lua, 0, 0, 0)执行该函数。

lua_pushstring(lua, "100");
lua_setglobal(lua, "gvar");
if (lua_pcall(lua, 0, 0, 0)){
    const char* error = lua_tostring(lua, -1); // returns "attempt to call a nil value"
    lua_pop(lua, 1);
}

这段代码将字符串推送到堆栈上,然后设置全局变量gvar。在调用lua_setglobal()之后,堆栈上应该没有任何内容。var已经存在。

在那之后,您尝试用lua_pcall调用堆栈顶部的函数,但堆栈是空的——这就是为什么您会得到attempt to call a nil value消息。