gpt4 book ai didi

c++ - SWIG 生成的 Lua<-->C++ 包装器错误处理由 typedef 重命名的原始类型

转载 作者:太空宇宙 更新时间:2023-11-04 12:13:43 24 4
gpt4 key购买 nike

我使用 SWIG 为工作项目生成 C++ <--> Lua 包装器。我的主要问题是,在这个项目的基础上,每个平台都存在类型定义。例如。对于 Win32,存在一个 header Win32Types.h,其中包含类似

typedef char Char;
typedef char TChar;
typedef signed int Int;
typedef unsigned int UInt;
typedef signed char Int8;
typedef unsigned char UInt8;
...

被定义。现在的问题是,像这样的示例类

class Named
{
public:
Named();
virtual ~Named();

void setName(const Char *name);
const Char* GetName() const;
}

,在 SWIG 包装器中生成的 setName- 方法看起来像这样:

static int _wrap_Named_SetName(lua_State* L) {
int SWIG_arg = 0;
Named *arg1 = (Named *) 0 ;
Char *arg2 = (Char *) 0 ;

SWIG_check_num_args("Named::SetName",2,2)

if(!SWIG_isptrtype(L,1))
SWIG_fail_arg("Named::SetName",1,"Named *");

if(!SWIG_isptrtype(L,2))
SWIG_fail_arg("Named::SetName",2,"Char const *");

if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Named,0))){
SWIG_fail_ptr("Named_SetName",1,SWIGTYPE_p_Named);
}

if (!SWIG_IsOK(SWIG_ConvertPtr(L,2,(void**)&arg2,SWIGTYPE_p_Char,0))){
SWIG_fail_ptr("Named_SetName",2,SWIGTYPE_p_Char);
}

...
}

这里的问题是,包装器试图将 Char 视为另一个类指针,尽管它只是一个重命名为 Char 的 char 指针。有什么办法可以避免这种行为?

我试着写了一个类似的类型图

%typemap(in) Char {
$1 = lua_tostring($input);
}

,但我不确定我的做法是否正确...

最佳答案

有两种更简单的方法可以做到这一点:

  1. 向 SWIG 显示该平台的 typedef,可能使用 %include
  2. 使用 %apply 告诉 SWIG 只使用普通的 unsigned char * 类型映射:

    %apply unsigned char * { const Char * }

关于c++ - SWIG 生成的 Lua<-->C++ 包装器错误处理由 typedef 重命名的原始类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8657397/

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