2013-10-01 108 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位。

相關問題