如何检查 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
的定义,因此宏将达到预期效果。
我有以下功能,我只想在 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
的定义,因此宏将达到预期效果。