gpt4 book ai didi

c++ - 如何检查 SWIG 接口(interface)文件中的 Lua 版本?

转载 作者:行者123 更新时间:2023-11-30 04:59:11 27 4
gpt4 key购买 nike

我有下面的函数,我只想在 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:您必须将预处理器宏移动到文字 block %{ ... %} 中.


在这种情况下

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

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

在变体中

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

SWIG 会将文字 block 内的所有内容转发到接口(interface)文件。这将在没有 SWIG 进一步检查的情况下发生,因此预处理器宏将保持不变。 C++ 编译器将包含 <lua.hpp>并找到 LUA_VERSION_NUM 的定义在那里,所以宏将达到预期的效果。

关于c++ - 如何检查 SWIG 接口(interface)文件中的 Lua 版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51349885/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com