1

我认为 lua_settop() 的文档很清楚:

void lua_settop (lua_State *L, int index);

接受任何可接受的索引或 0,并将堆栈顶部设置为此索引。如果新的顶部比旧的大,那么新元素用 nil 填充。如果 index 为 0,则删除所有堆栈元素。

...然而,这段代码:

lua_settop(L, 0);
top = lua_gettop(L);
if (lua_isnoneornil(L, top)) {
  printf("Invalid stack (nil)");
}
else {
  // WTF?
  printf("? %d -> %s", top, lua_typename(L, lua_type(L, top)));
}

产量:

? 0 -> table

是什么赋予了?

如何检查堆栈是否为空?使用 (lua_gettop(L) == 0)?

如果是这样,为什么还有一个 lua_isnone() 调用?

4

2 回答 2

5

文档对您的问题进行了简单的回答lua_gettop

返回栈顶元素的索引。因为索引从 1 开始,所以这个结果等于堆栈中元素的数量(因此 0 意味着一个空堆栈)。

于 2012-06-14T09:15:28.450 回答
1

仅供任何偶然发现这个问题的人参考,这个问题的另一个答案是来自 lua 文档:

大多数查询函数接受可用堆栈空间内的任何值作为索引,也就是说,索引达到您通过 lua_checkstack 设置的最大堆栈大小。这样的指数被称为可接受的指数。更正式地说,我们定义一个可接受的索引如下:

 (index < 0 && abs(index) <= top) ||
 (index > 0 && index <= stackspace)

请注意,0 绝不是可接受的索引。

如果 lau_gettop() 返回 0,则无法调用 is_none() 和 isoneornil(),因为 0 不是可接受的索引。

于 2012-06-15T06:49:09.800 回答