2013-10-01 6 views
3

Должен ли я использовать lua_tointeger(), или lua_tonumber(), при преобразовании номеров Lua в значения off_t?Могу ли я использовать lua_tointeger() для off_t?

Я проверил исходный код самой Lua, и я вижу, что их функция file:seek использует lua_Number, а не lua_Integer.

Я также вижу, что пакет использует lua_tonumber() (или luaL_checknumber() и т. Д.), Даже для чтения файлов decriptors (!).

А как насчет size_t?

Должен ли я перейти на «экстремальный» и использовать lua_tonumber()lua_pushnumber()) для всех интегральных типов C (mode_t, size_t и т. Д.)? Или я должен нормально использовать lua_tointeger() и прибегать к lua_tonumber() только тогда, когда я «чувствую» это потенциально большое число?

+1

Пожалуйста, всегда ссылайтесь на правильный источник. Вы привязаны к битве за код Веснота, а не [оригинальная реализация Lua 'file: 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_t или int64_t) ближе к off_t (uint32_t или uint64_t), чем double но Lua, вероятно, сохранить номер в формате double все равно.

С другой стороны, double может хранить целые числа точно до 2^52, если я правильно помню. В большинстве случаев этого должно быть достаточно.

Я предложил бы использовать lua_*number(), где вы ожидаете float/double и lua_*integer(), когда вы ожидаете целых чисел (как и все те ОС, связанные с функциями, смещений ТРК и позиций).

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-разрядной машине.

Смежные вопросы