Lua 5.3 弃用 luaL_checkint , luaL_checklong , luaL_optint , luaL_optlong ,这只是调用luaL_{check|opt}integer
的方便宏。
虽然我们仍然可以使用它们(因为 -DLUA_COMPAT_5_2
),但 user manual 中没有提及它们。我们建议使用luaL_{check|opt}integer
“带有类型转换”。
现在,我不是 C 方面的专家,我想知道:
在像下面这样的简单情况下是否需要强制转换?
int i; i = (int)luaL_checkinteger(L, 1);
如果这里不需要强制转换,那么哪里需要强制转换?
如果我们可以不需要这些已弃用的宏,那么为什么它们首先诞生呢?换句话说:他们提供什么?
如果函数名称中没有嵌入单词“int”/“long”,我们是否会丢失“文档”?
最佳答案
C 不需要这样的强制转换。
基本上,如果您希望数字的行为完全类似于特定的 C 类型,那么您应该将其转换为 1。如果您同意它像
lua_Integer
一样运行,那么您不需要强制转换它。因此,如果您希望值的范围在
int
范围内,那么您应该在从Lua中提取整数时对其进行强制转换。如果您尝试将其传递给像printf
这样的可变参数函数而不进行强制转换,它将获得lua_Integer
的完整范围,而不是int< 的范围
。这可能是您想要的,但如果不是,您就需要 Actor 阵容。添加它们是因为 Lua 5.3 之前的数字总是
double
。因此,要获得任何类型的整数都需要进行强制转换。直接从double
转换为int
比从double
转换为long
再转换为int
更好>。一旦 Lua 正式获得了精确的整数类型,这种需求就变得不那么重要了。请注意,从来没有
lua_checkfloat
。同样的原因也适用。这可以解释。但由于在 Lua 5.3 中整数是一等值,所以我认为最好能够按照 Lua 所看到的方式准确地获取整数。如果用户想要将其转换为不同的整数类型,这取决于他们。
至于更好的文档,这不是 C++11。这里没有
auto x = lua_checkinteger(...);
。当您使用它时,必须明确说明您正在使用的类型。如果您将其分配给变量,那么所有人都清楚您在做什么。如果你明确地转换它,那么你在做什么就很清楚了。如果您将其传递给函数,您所需要做的就是查看参数列表以了解它被转换成什么。
关于c - 我们是否应该显式地从 Lua 的 luaL_checkinteger() 等进行转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28098822/