gpt4 book ai didi

c++ - 我能保证Lua栈的大小吗?

转载 作者:搜寻专家 更新时间:2023-10-31 01:28:54 24 4
gpt4 key购买 nike

我正在使用适用于 C/C++ 的 Lua API 在 C/C++ 中创建函数,然后注册它们以便在 Lua 脚本中使用。显然,这些函数需要一定数量的特定类型的参数,这在 C/C++ 中没有问题,因为有静态类型。但是,鉴于 Lua 是动态的,当我从 Lua 调用此 C 函数时,我需要手动检查传递的参数数量及其类型。这些参数被压入 Lua 堆栈,因此我可以使用 lua_gettop 检查参数的数量,然后使用 lua_type 检查它们各自的类型。

不过,我的问题是,我能否保证堆栈中元素的数量,即传递给我的函数的参数数量?这样,我就可以在我的 C 函数的开头使用断言来检查它:assert(lua_gettop(L) == x)x 只是一个占位符对于所需数量的参数和 L 是一个 lua_State*。这扩展得更深一些,因为我想知道是否有其他与 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_State 从 C 调用该函数,但那是你的错)。

只要您在该函数的开始和用于检查当前堆栈大小的任何内容之间不进行任何堆栈操作,那么您的测试就是准确的。

每个 Lua 函数都详细记录了它如何(或是否)操作堆栈。是否将值插入堆栈,将它们从堆栈中移除,等等。

也就是说,assert 可能是错误的工具。如果用户提供了错误数量的参数,并且您认为是错误行为,则应该调用 lua_error。而不仅仅是在调试版本上。

关于c++ - 我能保证Lua栈的大小吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50954049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com