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

时间:2013-10-01 13:58:33

标签: c api lua

我写过这个简单的库:

#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

所以我相信图书馆正在加载。我的问题是我无法理解为什么我不能使用点运算符访问或函数。

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

2 个答案:

答案 0 :(得分:6)

or是Lua中的保留字(它是逻辑或运算符)。这就是Lua中所有现有的按位运算库将or-function命名为bor之类的原因。同样保留andnot。 (可以找到保留字的完整列表here。)

您仍然可以使用字符串调用它:

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

但是你最好按照现有的按位运算库的例子,并将其命名为or以外的其他东西。

答案 1 :(得分:2)

您正在使用or作为Lua中关键字的函数名称,请尝试使用其他名称,例如my_or