只要堆栈保持平衡,是否允许修改堆栈值?

时间:2017-11-27 17:19:39

标签: lua

每个人都知道保持堆栈平衡是一种很好的编程习惯。但我想知道的是,我是否可以修改从Lua脚本调用的C函数中的堆栈值?请考虑以下代码:

int myfunc(lua_State *L)
{
    int arg1 = luaL_checkinteger(L, 1);
    int arg2 = luaL_checkinteger(L, 2);

    // pop arg 2
    lua_pop(L, 1);

    // this is to be our return value
    lua_newtable(L);

    ...do complicated stuff...

    // restore second parameter but set it to nil for convenience's sake
    lua_pushnil(L);
    lua_insert(L, 2);

    // return our table
    return 1;
}

所以上面的代码用nil替换第二个参数。这是允许的还是我必须恢复原始值,即我必须这样做

lua_pushinteger(L, arg2);

而不是

lua_pushnil(L);

?或者只要myfunc返回并且堆栈平衡,这不重要吗?

1 个答案:

答案 0 :(得分:3)

堆栈值是被调用的C函数的属性。你可以随心所欲地做任何事情。对外部的唯一影响是函数返回的值。

从Lua调用的C函数不需要保持堆栈平衡,即使用相同的内容或项目数量。