任何人都可以请告诉我如何在C正确使用调用lua_pop()函数++。
我应该把它当我使用lua_get *()函数? 喜欢。
lua_getglobal(L, “东西”);
调用lua_pop(L,1);
或如何使用它? 将垃圾收集器的阈值之后清除这些东西吗? 谢谢。
任何人都可以请告诉我如何在C正确使用调用lua_pop()函数++。
我应该把它当我使用lua_get *()函数? 喜欢。
lua_getglobal(L, “东西”);
调用lua_pop(L,1);
或如何使用它? 将垃圾收集器的阈值之后清除这些东西吗? 谢谢。
你叫lua_pop()
从Lua的堆栈中删除的项目。 对于简单的功能,这可以是完全不必要的,因为该芯将清理堆栈作为处理的返回值的一部分。
对于更复杂的功能,尤其是对C代码被调用到Lua中,你会经常需要从栈中弹出的东西,以防止堆栈无限制地增长。
所述lua_getglobal()
函数将一个项目时调用堆栈,其是nil
,如果全球不存在或已命名的全局变量的值。 具有价值的堆栈上的副本,只要是有利于垃圾收集保护它。 该值需要,只要它是通过检索它,因为如果全球进行了修改,在栈上的副本可能是剩下的唯一参考的C代码使用留在堆栈中。
因此,对于使用全局的总体模式是类似这些:
void doMyEvent(lua_State *L) {
lua_getglobal(L, "MyEvent");
lua_call(L, 0, 0); /* pops the function and 0 parameters, pushes 0 results */
}
double getGlobalDouble(lua_State *L, const char *name) {
double d;
lua_getglobal(L,name);
d = lua_tonumber(L,1); /* extracts the value, leaves stack unchanged */
lua_pop(L,1); /* pop the value to leave stack balanced */
return d;
}
char *copyGlobalString(lua_State *L, const char *name) {
char *s = NULL;
lua_getglobal(L,name);
if (!lua_isnil(L,-1))
s = strdup(lua_tostring(L,-1));
lua_pop(L,1);
return s;
}
在最后一个例子,我很小心,因为返回的字符串指针的内容复制lua_tostring()
的值保持在栈上只保证长达有效。 该要求的呼叫者copyGlobalString()
负责调用free()
后面。
还要注意的是最近的版本的Lua手册包括与每个标识消耗堆栈的条目数函数一起的符号,并推数。 这有助于避免意外的堆栈增长。