Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以保证Lua堆栈的大小吗?_C++_C_Lua_Stack - Fatal编程技术网

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函数的

我正在使用C/C++的LuaAPI在C/C++中创建函数,然后将它们注册以在Lua脚本中使用。显然,这些函数需要特定类型的特定数量的参数,这在C/C++中是没有问题的,因为是静态类型。然而,鉴于Lua是动态的,当我从Lua调用这个C函数时,我需要手动检查传递的参数数量及其类型。这些参数被推送到Lua堆栈上,因此我可以使用
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
,但提供了有时有用的额外功能,因此您可以使用适合自己目的的功能。