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

发布于 2024-12-23 07:25:35 字数 1381 浏览 0 评论 0 原文

我使用 SWIG 生成 C++ <-->工作项目的 Lua 包装器。 我的主要问题是,在这个项目的基础上,每个平台都存在类型定义。例如,对于 Win32,存在一个标头 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);
}

,但我不确定我是否以正确的方式完成了...

I use SWIG to generate a C++ <--> Lua wrapper for a work project.
my main problem is, in this project at the base there exist type definitions for each platform. E.g. for Win32 there exists a header Win32Types.h where things like

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

are defined.
The problem is now, with an example class like

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

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

, the setName- Method generated in the SWIG-wrapper looks something like this:

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);
  }

  ...
}

the problem here is, the wrapper tries to treat Char as just another class pointer, although it is just a char pointer renamed to Char.
is there any way to circumvent this behaviour?

i tried to write a typemap like

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

, but im not sure i did it the right way...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无所的.畏惧 2024-12-30 07:25:35

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

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

    %apply unsigned char * { const Char * }
    

There's two easier ways you can do this:

  1. Show SWIG the typedefs for that platform, probably using %include
  2. Tell SWIG to just use the normal unsigned char * typemap using %apply:

    %apply unsigned char * { const Char * }
    
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文