2013-10-01 74 views
3

在将Lua数字转换为off_t值时,我应该使用lua_tointeger()还是lua_tonumber()我可以使用lua_tointeger()作为off_t吗?

我检查了Lua本身的源代码,发现它们的file:seek函数使用lua_Number而不是lua_Integer

我还看到,软件包广泛使用lua_tonumber()(或luaL_checknumber()等),甚至读取文件描述符(!)。

那么size_t呢?

对于所有积分C类型(mode_t,size_t等),我应该转到“极端”并使用lua_tonumber()(和lua_pushnumber())吗?或者我应该通常只使用lua_tointeger(),并且只有当我“感觉”这是一个潜在的大数字时,才会使用lua_tonumber()

+1

请始终链接到正确的来源。您链接到Wesnoth代码的战斗,而不是[原始Lua文件:seek'实现](http://www.lua.org/source/5.2/liolib.c.html#f_seek)。他们碰巧是一样的,但你将来永远都不会知道。 –

回答

1

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

ptrdiff_t(通常int32_tint64_t)接近off_tuint32_tuint64_t),比double的Lua将数字可能存储在double格式反正

另一方面,如果我没有记错的话,double可以存储精确到2^52的整数。在大多数情况下,它应该是足够的。如果你期望整数(如所有与FD有关的操作系统相关函数,偏移量和位置),我建议使用lua_*number(),你期望的范围是float/doublelua_*integer()

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位。

相关问题