SWIG生成的Lua<-->C++ Wrapper错误地处理了typedef重命名的基元类型

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

本文关键字:处理 typedef 类型 错误 重命名 C++ Lua lt SWIG gt Wrapper      更新时间:2023-10-16

我使用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
%typemap(in) Char {
  $1 = lua_tostring($input);
}

有两种更简单的方法:

  1. 显示该平台的typedef s,可能使用%include
  2. 告诉SWIG使用%apply来使用正常的unsigned char *类型映射:

    %apply unsigned char * { const Char * }