lua_Integer和lua_createtable(表大小限制)

时间:2015-01-11 03:48:52

标签: c lua lua-api lua-5.3

在Lua 5.3中,C API中与表相关的函数接收并返回lua_Integer

void lua_rawgeti (lua_State *L, int idx, lua_Integer n);
void lua_rawseti (lua_State *L, int idx, lua_Integer n);
lua_Integer luaL_len (lua_State *L, int index);

但是,lua_createtable仍会收到int

void lua_createtable (lua_State *L, int narr, int nrec);

在下面的示例函数中,源表的长度用于创建大小相同的副本。

static int copy_sequence(lua_State *L) {
   lua_Integer len, i;
   luaL_checktype(L, 1, LUA_TTABLE);
   len = luaL_len(L, 1);
   lua_createtable(L, (int)len, 0); /* conversion warning */
   for (i = 1; i <= len; i++) {
      lua_rawgeti(L, 1, i);
      lua_rawseti(L, -2, i);
   }
   return 1;
}

但是,需要演员才能使警告静音:

  

警告:从'lua_Integer'转换为'int'可能会改变其值[-Wconversion]

在Lua邮件列表中搜索,我发现以下thread是关于Lua 5.2的(也适用于早期版本):

  

引用:Roberto Ierusalimschy(2012年8月7日)

     

表的大小已限制为2147483647个元素。 LUA   内部使用'int'来索引其所有数组(字符串/字节除外)   阵列)。使用无符号值(例如size_t)很痛苦   到处; ptrdiff_t根本没有任何保证。

对于long long使用lua_Integer的Lua 5.3,情况仍然如此吗?在Lua 5.3中,上面示例中使用的int转换为lua_Integer是否安全?

1 个答案:

答案 0 :(得分:5)

表格的大小(元素数量)仍然限于“int”。那 不会阻止表具有任意lua_Integer键(只要 因为表格不是正确的序列。)