Lua 5.2 无法访问 C 库中的函数。

我写了这个简单的库:

#include "lua.h"
#include "lauxlib.h"

static int l_or(lua_State *l)
{
  int i, result = 0;
  int nargs = lua_gettop(l);
  for(i = 1; i <= nargs; ++i)
  {
    result |= lua_tointeger(l, i);
  }

  lua_pushnumber(l, result);
  return 1;
}

static const luaL_Reg mybit [] = {
  {"or", l_or},
  {NULL, NULL}  /* sentinel */
};

int __declspec(dllexport) luaopen_mybit (lua_State *L)
{
      luaL_newlibtable(L, mybit);
      luaL_setfuncs(L, mybit,0);
      return 1;
}

编译成一个名为mylib.dll的DLL。

然后我使用下面的脚本使用独立的Lua解释器进行测试:

print ("Test script")

mybit = require("mybit")
print(mybit)

mybit.or(1,2,3)
--print(mybit.or)

当我运行该脚本时,我得到以下输出:

lua: test.lua:6: <name> expected near 'or'

根据我看到的所有示例,这应该是完全可以的。如果我注释掉mybit.or(1,2,3),我得到

Test script
table: 005A8EB8

所以我相当自信库正在被加载。我的问题是我不明白为什么我不能使用点操作符访问or函数。

我正在使用使用mingw-gcc编译的Lua 5.2。

点赞
用户1009479
用户1009479

你正在使用 or 作为函数名,在 Lua 中 or 是一个关键字,尝试使用另一个名称,例如 my_or

2013-10-01 14:01:50
用户2755919
用户2755919

or 是 Lua 中的一个保留词(它是逻辑或运算符)。这就是为什么所有现有的 Lua 位运算库都会将 or 函数命名为类似 bor 的名称。andnot 同样也是保留词。(完整的保留词列表可以在这里找到。)

你仍然可以通过使用字符串的方式调用它:

print(mybit["or"](1,2,3))
print(mybit["or"])

但最好跟随现有的位运算库的示例,将其命名为 or 以外的其他名称。

2013-10-01 14:01:58