在Lua中,当返回C指针时,返回lua_integer类型而不是lightuserdata类型是否可以?

我的 C 库返回一个指向 lua 环境的 C 指针,我需要根据该 C 指针的值执行一些简单的操作,就像这样:

my_pointer = c_pointer + 4

由于我无法对轻量级用户数据(lightuserdata)做任何操作,所以我想知道是否可以返回一个 lua_integer 类型的 C 指针,而不是轻量级用户数据,以便我可以根据 C 指针的值进行简单的操作。

点赞
用户734069
用户734069

我将忽略 c_pointer + 4 不是一个“简单的操作”这一事实,因为 C++ 使用指针算术。因此,该表达式的结果将取决于 c_pointer 的类型。

我假设您想将指针作为_数字_暴露给 Lua,以便它可以进行数值运算。然后,您将在某个时候将其转换回指针。

这将有效...只要你只编译32位机器。在64位编译中,指针将具有64位大小。因此,您无法将它们转换为 double 并返回而不丢失数据。

此外,您可能会遇到基本类型的问题。如果您将指针公开为整数,则假定您还向 Lua 公开了一些将此指针作为整数作为输入的函数。这意味着 Lua 程序可以将任何数字塞入该函数,它将忠诚地假装是指针。

那很糟糕。

正确的方法是根本不向 Lua 公开指针。如果您需要 Lua 对“指针”执行数学运算,请公开一个完整的 userdata 类型,表示指针。但它应该在其 userdata 中存储原始指针和偏移量。重载它上面的算术操作,以便用户可以添加数字等。用户的添加等应该影响偏移量,而不是指针。或公开专用内存缓冲区对象,而不是指针。

或者,将指针公开为不透明值,然后让您所有的 API 都采用不透明指针 + 偏移量作为 Lua 数字。

简而言之,不要将指针公开给 Lua。

2013-05-07 06:32:23