lua_pcall在这做什么?

时间:2013-08-25 12:08:54

标签: c lua

我正在努力学习lua,我似乎被困在这里。

由于某种原因,以下代码实际上并不运行lua文件。

int main()
{
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);

    int width = 0;
    int height = 0;

    if(!luaL_loadfile(L, "./src/luaconf.lua") || !lua_pcall(L, 0, 0, 0)) 
    {
            lua_getglobal(L, "width");
            lua_getglobal(L, "height");

            if(!lua_isnumber(L, -2)) 
            {
                    luaL_error(L, "width isn't a number");
            }
            else
            {
                    width = lua_tointeger(L, -2);
            }

            if(!lua_isnumber(L, -1)) 
            {
                    luaL_error(L, "height isn't a number");
            }
            else
            {
                    height = lua_tointeger(L, -1);
            }
    }

    printf("%i x %i", width, height);

    return 0;

 }

我知道如果我将if(!luaL_loadfile(L, "./src/luaconf.lua") || !lua_pcall(L, 0, 0, 0)更改为if(luaL_dofile(L, "./src/luaconf.lua"))它会起作用,但我想知道为什么上面的代码不起作用。

不应该lua_pcall运行lua代码吗?如果不是为什么不呢?

luaconf.lua

width = 500
height = 40

1 个答案:

答案 0 :(得分:4)

请注意代码:

if(!luaL_loadfile(L, "./src/luaconf.lua") || !lua_pcall(L, 0, 0, 0)) 

如果luaL_loadfile成功,则返回LUA_OK,其值为0,因此||的左操作数评估为1,根据简短电路,lua_pcall将不会被执行。

所以你想要的可能是:

if ((luaL_loadfile(L, "./src/luaconf.lua") || lua_pcall(L, 0, 0, 0))
{
    //error handle
}
else
{
    //normal handle
}