Can I use lua_tointeger() for off_t?

3
我转换Lua数字为off_t值时,应该使用lua_tointeger()还是lua_tonumber()
我查看了Lua自身的源代码,发现他们的file:seek函数使用的是lua_Number而不是lua_Integer
我还注意到luaposix包广泛使用lua_tonumber()(或luaL_checknumber()等)甚至用于读取文件描述符!
那么size_t呢?
我应该极端情况下使用lua_tonumber()(和lua_pushnumber())转换所有整数C类型(mode_t、size_t等)吗?还是应该通常使用lua_tointeger(),只有在感觉可能是大数时才使用lua_tonumber()

1
请务必链接到正确的源代码。您链接到了Wesnoth战斗游戏的代码,而不是原始的Lua file:seek实现。它们恰好相同,但未来可能会有所不同。 - Lorenzo Donati support Ukraine
2个回答

2
由于off_tsize_t都是整数类型,因此您应该使用lua_tointeger
源代码中可以看出,lua_tointeger实际上将数字作为lua_Number获取,然后将其转换为lua_Integer。唯一需要考虑的是lua_Integer可能太小了,但它实际上是以ptrdiff_t实现的,在32位机器上通常是32位,在64位机器上通常是64位。

1
如果您自己构建Lua,则可以检查luaconf.h中如何定义lua_Number和lua_Integer。通常,lua_number与double相同,lua_Integer是ptrdiff_t。 ptrdiff_t(通常为int32_t或int64_t)比double更接近off_t(uint32_t或uint64_t),但Lua可能仍会以double格式存储数字。
另一方面,如果我没记错的话,double可以精确地存储整数,最多可达2^52。在大多数情况下,这应该足够了。
我建议在您期望float / double时使用lua_*number(),并在您期望整数(例如所有那些具有FD、偏移量和位置的操作系统相关函数)时使用lua_*integer()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接