我可以将 lua_tointeger() 用于 off_t 吗?
Posted
技术标签:
【中文标题】我可以将 lua_tointeger() 用于 off_t 吗?【英文标题】:Can I use lua_tointeger() for off_t? 【发布时间】:2013-10-01 07:25:03 【问题描述】:在将 Lua 数字转换为 off_t
值时,我应该使用 lua_tointeger()
还是 lua_tonumber()
?
我检查了 Lua 本身的源代码,我发现他们的 file:seek 函数使用 lua_Number
,而不是 lua_Integer
。
我还看到luaposix 包广泛使用lua_tonumber()
(或 luaL_checknumber() 等),甚至读取文件描述符(!)。
那么size_t
呢?
我是否应该走“极端”,对所有整数 C 类型(mode_t、size_t 等)使用lua_tonumber()
(和lua_pushnumber()
)?或者我应该通常使用lua_tointeger()
并仅在我“感觉”它是一个潜在的大数字时才使用lua_tonumber()
?
【问题讨论】:
请始终链接到正确的来源。你链接到韦诺之战代码,而不是original Luafile:seek
implementation。它们碰巧是一样的,但你永远不知道未来。
【参考方案1】:
由于off_t
和size_t
都是整数类型,你应该使用lua_tointeger
。
从the source,lua_tointeger
实际上得到的数字是lua_Number
,然后是converts it to lua_Integer
。唯一需要担心的是lua_Integer
可能太小,但因为它被实现为ptrdiff_t
,实际上通常在 32 位机器上是 32 位,在 64 位机器上是 64 位。
【讨论】:
【参考方案2】:如果你自己构建 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 的整数。在大多数情况下,它应该足够了。
我建议使用 lua_*number()
在您希望使用整数时使用 float/double
和 lua_*integer()
(就像所有那些与 FD、偏移和位置相关的操作系统相关函数)。
【讨论】:
以上是关于我可以将 lua_tointeger() 用于 off_t 吗?的主要内容,如果未能解决你的问题,请参考以下文章
用于 I/O 的最新 Windows 线程池 API 使用情况