繁体   English   中英

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

[英]SWIG-generated Lua<-->C++ Wrapper mishandling primitive types renamed by typedef

我使用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;
}

setName在SWIG-wrapper中生成的方法如下所示:

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. 告诉SWIG使用%apply使用普通的unsigned char *映射:

     %apply unsigned char * { const Char * } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM