1

我有以下代码:

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

lua_close(lua);

调用函数和获取全局变量工作正常,但是当我尝试设置全局变量时,我得到“尝试调用 nil 值”。我不明白为什么会这样?

4

1 回答 1

2
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消息的原因。

于 2013-08-07T11:27:24.787 回答