C++ Lua设置全局变量时出错。

我有以下代码:

lua_State *lua;
lua = lua_open();
luaL_openlibs(lua);

std::string code = "print(gvar)\n"
    "function test()\n"
    "print(gvar)\n"
    "end\n";

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); // 返回 "attempt to call a nil value"
    lua_pop(lua, 1);
}

lua_close(lua);

调用函数和获取全局变量都可以正常运行,但是当我尝试设置全局变量时,我得到了“attempt to call a nil value”的错误信息。我不明白为什么会出现这种情况?

点赞
用户1022729
用户1022729

这段代码使用 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); // 返回 "attempt to call a nil value"
    lua_pop(lua, 1);
}

此代码将字符串推送到堆栈上,然后设置全局变量 gvar。在调用 lua_setglobal() 后,堆栈上不应该有任何内容。变量已经在那里。

现在,在堆栈上尝试使用 lua_pcall 调用顶部的函数,但堆栈为空 - 这就是为什么会出现 attempt to call a nil value 的原因。

2013-08-07 11:27:24