如何在 SWIG 接口文件中检查 Lua 版本?

我有下面的函数,我只想在 Lua 版本等于或小于 5.1 时使用它。

所以我在 myBindings.i 文件中像下面这样写:

/* 用于将 lua_len 回退到 Lua 5.1 */
#if LUA_VERSION_NUM <= 501
%{
static void lua_len(lua_State *L, int i)
{
    switch (lua_type(L, i))
    {
        case LUA_TSTRING:
            lua_pushnumber(L, (lua_Number)lua_objlen(L, i));
            break;
        case LUA_TTABLE:
            if (!luaL_callmeta(L, i, "__len"))
            lua_pushnumber(L, (lua_Number)lua_objlen(L, i));
            break;
        case LUA_TUSERDATA:
            if (luaL_callmeta(L, i, "__len"))
            break;
        default:
        luaL_error(L, "attempt to get length of a %s value",
                   lua_typename(L, lua_type(L, i)));
  }
}
%}
#endif

然而,当我编译代码时,编译器不会跳过 Lua 5.3lua_len 函数。

我该如何根据版本信息向编译器公开 lua_len 函数?

点赞
用户1944004
用户1944004

TL;DR: 你需要将预处理器宏放到文本块 %{ ... %} 中。


在这个场景中:

#if CONDITION
%{
...
%}
#endif

CONDITION 是由 SWIG 评估的。SWIG 不知道宏 LUA_VERSION_NUM,因为它是一个先验接口无关的宏(即你也可以生成 Python 接口,其中 LUA_VERSION_NUM 没有意义)。

在变体中:

%{
#if CONDITION
...
#endif
%}

SWIG 将会把文本块中的一切都直接转发到接口文件中。这是字面上发生的,没有经过 SWIG 的进一步检查,所以预处理器宏将保持不变。C++ 编译器将包含 <lua.hpp> 并在那里找到 LUA_VERSION_NUM 的定义,因此宏将产生其预期的效果。

2018-07-15 21:36:38