Lua 5.X 创建 lua C 模块

我正在尝试编写一个可以与 Lua 5.0.x-5.4.x 一起使用的 Lua 模块。由于每个小版本似乎都会引入和文档不完整的更改 C API,从而破坏向后兼容性,因此我想知道如何通过最少的基于 Lua 版本的条件编译来实现此目标。

例如,下面的代码应该适用于 Lua 5.1,但不适用于更高的版本:

#define LUA_LIB
#include "lua.h"
#include "lauxlib.h"

static int foo(lua_State *L)
{
  int a = luaL_checknumber(L, 1);
  int b = luaL_checknumber(L, 2);

  lua_pushnumber(L, a + b);

  return 1;
}

luaL_Reg foolib[] = {
  {"foo", foo},
  {NULL, NULL}
};

LUALIB_API int luaopen_foo(lua_State *L)
{
  luaL_register(L, foolib);
  return 1;
}

我该如何调整它以适用于 Lua5.2 及以上版本?甚至使其能够抵御未来 API 更改?

原文链接 https://stackoverflow.com/questions/65657883

点赞
stackoverflow用户3677376
stackoverflow用户3677376

以下代码片段可以让您开始:

#include <lua.h>
#include <lauxlib.h>
#include "compat-5.3.h"

static int foo(lua_State* L)
{
  lua_Integer a = luaL_checkinteger(L, 1);
  lua_Integer b = luaL_checkinteger(L, 2);
  lua_pushinteger(L, a + b);
  return 1;
}

static luaL_Reg const foolib[] = {
  { "foo", foo },
  { 0, 0 }
};

#ifndef FOO_API
#define FOO_API
#endif

FOO_API int luaopen_foo(lua_State* L)
{
  luaL_newlib(L, foolib);
  return 1;
}

它依赖于 Compat-5.3 项目的 C-API 端口,并且可以在 Lua 5.1-5.4 上编译和运行。Compat-5.3 为 Lua 5.1 和 5.2 提供了 Lua 5.3 兼容性。您只需要头文件和 C 源文件即可。对于单个源文件模块,您只需包括头文件,对于多源文件模块,您还应该定义预处理符号并单独编译/链接 compat-5.3.c 文件。有关详细信息,请参见 README.md。虽然 Lua 5.4 C API 与 Lua 5.3 大多数兼容,但计划启动一个 Compat-5.4 项目(请参见 此问题)。

对于 Lua 5.0 的支持,您需要自行解决。

2021-01-11 02:51:03
stackoverflow用户107090
stackoverflow用户107090

如果你更改下面的代码

luaL_register(L, foolib);

luaL_newlib(L, foolib);

你的代码将在 Lua 5.2+ 中保持不变。 如果需要对 Lua 5.0 和 Lua 5.1 进行适配,你需要使用兼容头文件。我建议你编写最新版 Lua 的代码,并为之前的版本编写兼容性宏定义。参见我的库示例。

2021-01-11 11:39:28