如何检查在痛饮接口文件Lua版本?(How to check Lua version in SWIG

2019-09-26 02:02发布

我有以下功能,我想用只有当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_len在Lua功能5.3

我怎么可以公开lua_len功能,根据版本信息,编译器?

Answer 1:

TL; DR:你必须移动文字块内的预处理宏%{ ... %}


在这种情况下

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

CONDITION是通过SWIG评价。 痛饮不知道宏观LUA_VERSION_NUM因为它是一个先验的接口不可知的(例如,你也可以生成一个Python接口,其中LUA_VERSION_NUM没有意义)。

在变型

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

SWIG将转发文字块的接口文件中的一切。 这会从字面上发生没有通过任何SWIG进一步检查,所以预处理宏将不变。 C ++编译器将包括<lua.hpp>并且发现的定义LUA_VERSION_NUM那里,所以宏将具有其预期的效果。



文章来源: How to check Lua version in SWIG interface file?