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

How to check Lua version in SWIG interface file?

我有以下功能,我只想在 Lua 版本等于或小于 5.1 时使用。

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

/* used to backport lua_len to 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.3.

中的 lua_len 函数

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

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 的定义,因此宏将达到预期效果。