我们应该从Lua的luaL_checkinteger()等函数中显式转换吗?

Lua 5.3弃用了luaL_checkintluaL_checklongluaL_optintluaL_optlong这些仅作为方便使用的宏,它们只是调用luaL _ {check | opt}integer

虽然因为-DLUA_COMPAT_5_2的原因我们仍然可以使用它们,但是它们没有在用户手册中提到,建议我们使用“带有类型转换”的“luaL_{check | opt}integer”进行代替。

我不是C语言方面的专家,我正在想:

1.在像下面这样的简单情况下,是需要进行类型转换吗?

int i;
i = (int)luaL_checkinteger(L, 1);

2.如果这里不需要转换,那么在哪里需要转换呢?

3.为什么第一次要引入这些已弃用的宏,如果我们没有它们也能做到?换句话说:它们有什么用途?

4.如果函数名中没有嵌入“int”/“long”这些词语,我们不会失去“文档”吗?

点赞
用户734069
用户734069
  1. C 不需要这样的强制转换。

  2. 基本上,如果你想让数字的行为 完全 像一个特定的 C 类型,那么你应该将它转换为一个。如果你可以接受它的行为像一个lua_Integer,那么你就不需要强制转换。

    所以,如果你希望值的范围在 int 的范围之内,那么在从 Lua 中提取整数时应该进行转换。如果你试图传递给像 printf 这样的可变参数函数而没有强制转换,它将获得 lua_Integer 的完整范围,而不是 int 的范围。这可能是你想要的,但如果不是,你需要强制转换。

  3. 它们被添加是因为 pre-Lua 5.3 数字总是 double。因此,要获得任何一种整数类型 需要 强制转换。直接从 double 转换为 int 比从 double 转换为 long 再转换为 int 更好。一旦 Lua 正式获得了一个精确的整数类型,这种需求就变得不那么重要了。

    注意,从来没有 lua_checkfloat。同样的原因也适用。

  4. 这是开放给解释的。但是,由于整数是 Lua 5.3 中的一流值,我认为最好能够精确地提取整数,就像 Lua 看到的那样。如果用户想将其转换为不同的整数类型,那就由他们自己决定。

    至于更好的文档,这不是 C++11。这里没有 auto x = lua_checkinteger(...);。你使用的类型在使用时必须明确声明。如果你将其赋值给一个变量,所有人都清楚你正在做什么。如果你明确地强制转换它,那么再次说明了你正在做什么。如果你将它传递给一个函数,你只需要看一下参数列表就可以看出它被转换成什么了。

2015-12-08 18:11:38