【发布时间】:2014-02-09 23:37:00
【问题描述】:
我正在使用 Swig 包装一个 C 库,以便能够在 PHP 中使用它。该库使用u_char * 而不是unsigned char *。 Swig 将 u_char 视为它不知道的结构。
这会导致生成的代码检查参数类型,当我将字符串作为char * 数据传递时,这显然会失败。
我如何告诉 Swig u_char 指针只是 unsigned char 指针?
即这个 C 函数
int c_library_function(u_char *data, size_t data_size);
在生成的代码中有这个检查:
if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_unsigned_char, 0) < 0) {
SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of c_library_function. Expected SWIGTYPE_p_unsigned_char");
}
失败的地方。
我尝试在 Swig 模板中添加%typemap(ctype) u_char "unsigned char",似乎没有效果。
编辑为了澄清一件事,u_char 绝对是一个无符号字符。库中的 C 文件包括 sys/types.h,其中包括 bits/types.h,其中包含以下条目:
typedef unsigned char __u_char;
此外,只需编写一个函数来包装对 C 函数的调用,以便能够转换类型,就可以按预期工作:
void libraryFunction(u_char *foo) {
//Does stuff with foo
}
void castLibraryFunction(char *foo) {
libraryFunction((u_char *)foo);
}
但我不想为每个需要 u_char* 参数的函数编写一个包装器。
更明显的是,Swig 正在检查的类型是SWIGTYPE_p_unsigned_char,也就是说,数据类型是“unsigned char”,但没有使用“unsigned char”指针,而是指向自定义结构的指针。
【问题讨论】:
标签: c swig unsigned-char