将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()
?
答案 0 :(得分:2)
由于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位机。
答案 1 :(得分:1)
如果您自己构建Lua,可以在luaconf.h
签入如何定义lua_Number和lua_Integer。
通常lua_number与double相同,lua_Integer是ptrdiff_t。
ptrdiff_t
(通常为int32_t
或int64_t
)距离off_t
uint32_t
或uint64_t
}更接近double
但是 Lua可能会以double
格式存储该号码。
另一方面,如果我没记错的话,double
可以精确存储整数最多2 ^ 52。在大多数情况下,它应该足够了。
我建议您在期望整数的情况下使用lua_*number()
float/double
和lua_*integer()
(就像所有那些与FD,偏移和位置相关的操作系统相关函数)。