3

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”字样而丢失了“文档”吗?

4

1 回答 1

1
  1. C 不需要这样的演员表。

  2. 基本上,如果您希望数字的行为与特定的 C 类型完全一样,那么您应该将其强制转换为 1。如果你对它表现得像 alua_Integer没问题,那么你不需要强制转换它。

    因此,如果您希望值的范围在 的范围内int,那么您应该在将整数从 Lua 中拉出时进行转换。如果您尝试将其传递给printf不带强制转换的可变参数函数,它将获得 的全部范围lua_Integer,而不是 . 的范围int。这可能是你想要的,但如果不是,你需要演员表。

  3. 添加它们是因为 Lua 5.3 之前的数字总是doubles。因此,要获得任何类型的整数都需要强制转换。直接转换 from doubletoint比 from doubleto longto 好int。一旦 Lua 正式获得了精确的整数类型,这种需求就变得不那么重要了。

    请注意,从来没有一个lua_checkfloat. 同样的道理也适用。

  4. 这是可以解释的。但是由于整数是 Lua 5.3 中的一等值,我想说最好能够完全按照 Lua 看到的方式获取整数。如果用户想将其转换为不同的整数类型,这取决于他们。

    至于更好的文档,这不是 C++11。这里没有auto x = lua_checkinteger(...);。您使用的类型必须在使用时明确说明。如果您将它分配给一个变量,那么您所做的一切都很清楚。如果你明确地投射它,那么你在做什么就很清楚了。如果你将它传递给一个函数,你需要做的就是查看参数列表,看看它被转换成什么。

于 2015-12-08T18:11:38.273 回答