C 为什么空堆栈的顶部是lua中的表?

C 为什么空堆栈的顶部是lua中的表?,c,lua,C,Lua,我认为lua_settop()的文档非常清楚: void lua_settop(lua_State*L,int index) 接受任何可接受的索引或0,并将堆栈顶部设置为此索引。如果 新顶部比旧顶部大,则新元素填充为零。如果 索引为0,则删除所有堆栈元素 …然而,这段代码: lua_settop(L, 0); top = lua_gettop(L); if (lua_isnoneornil(L, top)) { printf("Invalid stack (nil)"); } else {

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

void lua_settop(lua_State*L,int index)

接受任何可接受的索引或0,并将堆栈顶部设置为此索引。如果 新顶部比旧顶部大,则新元素填充为零。如果 索引为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()调用都有?

您的问题在以下文档中得到了简单的回答:

返回堆栈中顶部元素的索引。因为指数 从1开始,此结果等于 堆栈(,因此0表示空堆栈)


您的问题在以下文档中得到了简单的回答:

返回堆栈中顶部元素的索引。因为指数 从1开始,此结果等于 堆栈(,因此0表示空堆栈)


对于其他在这个问题上遇到困难的人,请参考,这个问题的另一个答案是,来自lua文档:

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

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

(index<0&&abs(index)0&&index仅供其他偶然发现此问题的人参考,此问题的另一个答案是,来自lua文档:

大多数查询函数都接受可用堆栈空间内的任何值作为索引,即通过lua_checkstack设置的最大堆栈大小的索引。此类索引称为可接受索引。更正式地说,我们定义可接受索引如下:

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

(index<0&&abs(index)0&&index是,使用
lua_gettop(L)==0
检查堆栈是否为空。是,使用
lua_gettop(L)==0
检查堆栈是否为空。即lua_isnone()和lua_isnoneornil()都是无用的函数。很棒的文档。@Doug:为什么它们没用?当然
lua\u isnoneornil
非常方便,因为如果值存在但为
nil
,则返回true。这对检查堆栈的大小没有帮助。
lua\u isnone
是一个方便的函数。因为可以替换函数call with code并不意味着您应该这样做。
lua_isnoneornil()
旨在使处理可选或缺少的参数更加方便。您可以在大于0且小于或等于
lua_gettop()的堆栈插槽上使用它
。如果你问它关于不在堆栈上的堆栈插槽的问题,它将返回无意义的结果。这里的关键是一个毫无帮助的遥远事实,即“请注意,0永远不是一个可接受的索引。”即lua_isnone()和lua_isnoneornil()都是无用的函数。很棒的文档。@Doug:为什么它们没用?当然
lua\u isnoneornil
非常方便,因为如果值存在但为
nil
,则返回true。这对检查堆栈的大小没有帮助。
lua\u isnone
是一个方便的函数。因为可以替换函数call with code并不意味着您应该这样做。
lua_isnoneornil()
旨在使处理可选或缺少的参数更加方便。您可以在大于0且小于或等于
lua_gettop()的堆栈插槽上使用它
。如果你问它关于不在堆栈上的堆栈插槽的问题,它将返回无意义的结果。这里的关键是一个没有帮助的遥远的事实,“请注意,0永远不是一个可接受的索引。”