为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更改具有鲁棒性?

西菲乔

以下代码段将帮助您入门:

#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有计划启动Compat-5.4项目(请参阅本期),但是Lua 5.4 C API仍然与Lua 5.3兼容。

不幸的是,对于Lua 5.0支持,您是一个人。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章