c - 我们是否应该显式地从 Lua 的 luaL_checkinteger() 等进行转换?

标签 c lua lua-api lua-5.3

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 方面的专家,我想知道:

  1. 在像下面这样的简单情况下是否需要强制转换?

    int i;
    i = (int)luaL_checkinteger(L, 1);
    
  2. 如果这里不需要强制转换,那么哪里需要强制转换?

  3. 如果我们可以不需要这些已弃用的宏,那么为什么它们首先诞生呢?换句话说:他们提供什么?

  4. 如果函数名称中没有嵌入单词“int”/“long”,我们是否会丢失“文档”?

最佳答案

  1. C 不需要这样的强制转换。

  2. 基本上,如果您希望数字的行为完全类似于特定的 C 类型,那么您应该将其转换为 1。如果您同意它像 lua_Integer 一样运行,那么您不需要强制转换它。

    因此,如果您希望值的范围在int范围内,那么您应该在从Lua中提取整数时对其进行强制转换。如果您尝试将其传递给像 printf 这样的可变参数函数而不进行强制转换,它将获得 lua_Integer 的完整范围,而不是 int< 的范围。这可能是您想要的,但如果不是,您就需要 Actor 阵容。

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

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

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

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

关于c - 我们是否应该显式地从 Lua 的 luaL_checkinteger() 等进行转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28098822/

相关文章:

c++ - 如何检测加密的文件?

c - 我不明白 K&R C 书中的 atoi 函数?

lua - 如何检查两个表(对象)在Lua中是否具有相同的值

Linux OS Lua 执行命令关闭操作系统 - 帮助新手理解

c++ - 在运行它之前,如何通过 lua C API 为一段 lua 代码设置环境表?

c - 如何创建一个名称取自 PostgreSQL 中的字符串的表?

c - C中的进程循环

Luac 不能使用一个脚本

c - 使用 C API 的弱表和 GC 终结器

c - 从 c api 内部创建 lua 表时出错