我们应该从Lua的luaL_checkinteger()等人中明确地演绎出来吗?

时间:2015-01-22 21:15:47

标签: c lua lua-api lua-5.3

Lua 5.3弃用了luaL_checkintluaL_checklongluaL_optintluaL_optlong,它们只是调用luaL_{check|opt}integer的便捷宏。

虽然我们仍然可以使用它们(因为-DLUA_COMPAT_5_2),但user manual中没有提及它们,我们建议使用luaL_{check|opt}integer&#34 ;使用类型演员"。

现在,我不是C的专家,我想知道:

  1. 在如下的简单案例中是否需要演员?

    int i;
    i = (int)luaL_checkinteger(L, 1);
    
  2. 如果此处不需要演员, 需要演员?

  3. 如果没有它们,为什么那些被弃用的宏出生在第一位?换句话说:他们服务的是什么?

  4. 我们失去了"文档"没有单词" int" /" long"嵌入在函数名称中?

1 个答案:

答案 0 :(得分:1)

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

  2. 基本上,如果您希望数字的行为完全,就像特定的C类型一样,那么您应该将其转换为一个。如果你的行为像lua_Integer一样好,那么你就不需要施放它。

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

  3. 添加它们是因为Lua 5.3之前的数字始终为double s。因此,要获得任何类型的整数 required 一个演员。最好从double直接转换为int,而不是从double转换为long转换为int。一旦Lua正式得到一个完全整数类型,那个需求变得不那么重要了。

    请注意,从来没有lua_checkfloat。同样的理由适用。

  4. 这是可以解释的。但由于整数是Lua 5.3中的一等值,我认为最好能够像Lua看到的那样获取整数。如果用户想要将其转换为不同的整数类型,则取决于它们。

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