我的 C 库返回一个指向 lua 环境的 C 指针,我需要根据该 C 指针的值做一些简单的操作,就像:
my_pointer = c_pointer + 4
由于我对 lightuserdata 无能为力,所以我想知道是否可以为 C 指针返回一个 lua_integer 类型而不是 lightuserdata,这样我就可以根据 C 指针的值进行简单的操作
由于 C++ 使用指针运算,我将忽略它c_pointer + 4
不是“简单操作”的事实。因此,该表达式的结果会因类型而异c_pointer
。
我假设您想将指针作为数字公开给 Lua,它可以对其进行数值运算。然后,您将在某个时候将其转换回指针。
这将工作......只要你只为 32 位机器编译。在 64 位编译中,指针大小为 64 位。所以你不能在double
不丢失数据的情况下将它们转换为 s 并返回。
此外,您可能会遇到基本类型的问题。如果您将指针公开为整数,那么大概您还向 Lua 公开了一些函数,该函数将此指针作为整数。这意味着 Lua 程序可以将任何数字塞入该函数,它会尽职尽责地假装是一个指针。
那很糟。
这样做的正确方法是根本不公开指向 Lua 的指针。如果您需要 Lua 对“指针”进行数学运算,请公开表示指针的完整用户数据类型。但它应该在其用户数据中存储原始指针和偏移量。重载其上的算术运算,以便用户可以向其添加数字等等。用户的添加等应该影响偏移量,而不是指针。或者公开一个专用的内存缓冲区对象,而不是一个指针。
或者,将指针公开为不透明值,然后让所有 API 将不透明指针 + 偏移量作为 Lua 数字。
简而言之,不要暴露指向 Lua 的指针。