Должны ли мы явно приводить из Lua luaL_checkinteger() и др.?
Lua 5.3 не поддерживает luaL_checkint, luaL_checklong, luaL_optint, luaL_optlong, которые были просто вызовом удобных макросов luaL_{check|opt}integer
,
Хотя мы все еще можем использовать их (из-за -DLUA_COMPAT_5_2
), они не упомянуты в руководстве пользователя, и мы рекомендуем использовать luaL_{check|opt}integer
"с приведением типа".
Теперь я не эксперт по Си, и мне было интересно:
Нужно ли приведение в простых случаях, подобных следующему?
int i; i = (int)luaL_checkinteger(L, 1);
Если здесь не нужен актерский состав, где он нужен?
Почему эти устаревшие макросы родились в первую очередь, если мы можем обойтись без них? Другими словами: что они служили?
Разве мы не теряем "документацию", не вставляя слова "int"/"long" в имя функции?
1 ответ
С не требует такого броска.
По сути, если вы хотите, чтобы число вело себя точно так же, как определенный тип C, вам следует привести его к одному. Если вы в порядке с ним, ведя себя как
lua_Integer
тогда вам не нужно разыгрывать его.Поэтому, если вы хотите, чтобы диапазон значений находился в пределах диапазона
int
тогда вы должны разыграть его, когда вытащите целое число из Lua. Если вы попытаетесь передать его в переменную функцию, такую какprintf
без актерского состава, он получит полный спектрlua_Integer
, а не диапазонint
, Это может быть тем, что вы хотите, но если это не так, вам нужен актерский состав.Они были добавлены, потому что до версии Lua 5.3 были всегда
double
s. Таким образом, для получения целого числа требуется приведение. Лучше изdouble
вint
напрямую, чем отdouble
вlong
вint
, Как только Lua формально получил точный целочисленный тип, эта потребность стала менее важной.Обратите внимание, что никогда не было
lua_checkfloat
, По той же причине.Это открыто для интерпретации. Но так как целые числа являются первоклассными значениями в Lua 5.3, я бы сказал, что лучше получить целое число в точности так, как это видит Lua. Если пользователь хочет привести его к другому целочисленному типу, это его дело.
Что касается лучшей документации, это не C++11. Нет никаких
auto x = lua_checkinteger(...);
Вот. Тип, который вы используете, должен быть явно указан при его использовании. Если вы присваиваете его переменной, всем понятно, что вы делаете. Если вы явно разыгрываете это, тогда снова становится ясно, что вы делаете. Если вы передаете его функции, все, что вам нужно сделать, - это просмотреть список аргументов, чтобы увидеть, во что он преобразуется.