我可以将lua_tointeger()用于off_t吗?

时间:2013-10-01 07:25:04

标签: c lua

将Lua号码转换为lua_tointeger()值时,我应该使用lua_tonumber()还是off_t

我查看了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()

2 个答案:

答案 0 :(得分:2)

由于off_tsize_t都是整数类型,因此您应该使用lua_tointeger

the source开始,lua_tointeger实际上将数字设为lua_Number,然后converts it to lua_Integer。唯一的问题是lua_Integer可能太小,但实现为ptrdiff_t,实际上通常是32位机器上的32位和64位上的64位机。

答案 1 :(得分:1)

如果您自己构建Lua,可以在luaconf.h签入如何定义lua_Number和lua_Integer。 通常lua_number与double相同,lua_Integer是ptrdiff_t。

ptrdiff_t(通常为int32_tint64_t)距离off_t uint32_tuint64_t}更接近double但是 Lua可能会以double格式存储该号码

另一方面,如果我没记错的话,double可以精确存储整数最多2 ^ 52。在大多数情况下,它应该足够了。

我建议您在期望整数的情况下使用lua_*number() float/doublelua_*integer()(就像所有那些与FD,偏移和位置相关的操作系统相关函数)。