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;
}
,在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);
}
有两种更简单的方法:
- 显示该平台的
typedef
s,可能使用%include
-
告诉SWIG使用
%apply
来使用正常的unsigned char *
类型映射:%apply unsigned char * { const Char * }
相关文章:
- C++:TypeDef使用元组
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 对字符串进行排序时,在c++中处理sort()
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- SWIG生成的Lua<-->C++ Wrapper错误地处理了typedef重命名的基元类型