C++ 我可以保证Lua堆栈的大小吗?
我正在使用C/C++的LuaAPI在C/C++中创建函数,然后将它们注册以在Lua脚本中使用。显然,这些函数需要特定类型的特定数量的参数,这在C/C++中是没有问题的,因为是静态类型。然而,鉴于Lua是动态的,当我从Lua调用这个C函数时,我需要手动检查传递的参数数量及其类型。这些参数被推送到Lua堆栈上,因此我可以使用C++ 我可以保证Lua堆栈的大小吗?,c++,c,lua,stack,C++,C,Lua,Stack,我正在使用C/C++的LuaAPI在C/C++中创建函数,然后将它们注册以在Lua脚本中使用。显然,这些函数需要特定类型的特定数量的参数,这在C/C++中是没有问题的,因为是静态类型。然而,鉴于Lua是动态的,当我从Lua调用这个C函数时,我需要手动检查传递的参数数量及其类型。这些参数被推送到Lua堆栈上,因此我可以使用Lua_gettop检查参数的数量,然后使用Lua_type检查它们各自的类型 但是,我的问题是,我能否保证堆栈中元素的数量,即传递给函数的参数的数量?这样,我可以在我的C函数的
Lua_gettop
检查参数的数量,然后使用Lua_type
检查它们各自的类型
但是,我的问题是,我能否保证堆栈中元素的数量,即传递给函数的参数的数量?这样,我可以在我的C函数的开头用一个断言来检查这一点:assert(lua_gettop(L)==x)
,其中x
只是所需参数数量的占位符,L
是lua_状态*
。这扩展了更深一点,因为我想知道,当我调用这个函数时,是否其他与Lua堆栈交互的函数会清理堆栈,从而使堆栈为空;否则,如果前一个函数调用中的某些内容留在堆栈上,则断言将失败。下面是一个简单的例子
C/C++代码:
int foo(lua_State* L) {
assert(lua_gettop(L) == 2);
// do stuff
return 1;
}
在Lua中调用函数。假设函数需要两个字符串作为参数;因此,第一个调用将成功,第二个调用将失败
foo("hello", "world")
foo("hello", "world", 1)
如果您直接向Lua注册了一个函数,并且Lua脚本使用N个参数调用该函数,那么当调用该函数时,该函数的堆栈上将有N个值。这就是它的工作原理,没有任何进程可以干扰它(好吧,您可以使用不正确的
lua_状态
从C手动调用该函数,但这是您的错)
只要在函数开始和检查当前堆栈大小之间不进行任何堆栈操作,那么测试将是准确的
每个Lua函数都有很好的文档记录,说明它如何(或是否)操纵堆栈。它是否将值插入堆栈、从堆栈中删除值,等等
也就是说,
assert
可能是错误的工具。如果用户提供了错误的参数数量,并且考虑错误行为,则应该调用<代码> LuaAyError < /代码>。而且不仅仅是调试版本。谢谢您的精彩回答。至于在传递的参数太多或太少的情况下引发错误,luaL_error
是否也合适?luaL_error
(和luaL_argerror
)都调用lua_error
,但提供了有时有用的额外功能,因此您可以使用适合自己目的的功能。