我几乎不懂C++,所以这没有帮助,我的XS也没有好到哪里去。我正在为C++库创建一个XS接口,除了一个方法外,我几乎所有的方法都可以工作。
Perl中的方法应该是这样的:
$return_data = $obj->readPath( $path );
该方法被定义为.h文件:
int readPath(const char* path, char* &buffer, bool flag=true);
如果"缓冲区"以NULL形式传递,它将被分配。
readPath还有两个不同签名的附加版本,但它们不是我想要的。(有趣的是,当我尝试编译它时,告诉我"候选者"是我不想要的两个。)这是因为它不理解"char*&"吗?
有人能帮我写xsub吗?
我使用的是Perl 5.14.2。
顺便说一句——我还使用了一个类型映射"long-long-int"到T_IV。我找不到任何关于如何正确键入long-long的文档。有什么建议我应该如何打字?
谢谢,
我从未从C或XS处理过C++。如果是C,它将是:
void
readPath(SV* sv_path)
PPCODE:
{
char* path = SvPVbyte_nolen(sv_path, len);
char* buffer = NULL;
if (!readPath(path, &buffer, 0))
XSRETURN_UNDEF;
ST(0) = sv_2mortal(newSVpv(buffer, 0));
free(buffer);
XSRETURN(1);
}
希望这能奏效,或者你可以调整它以适应工作。
我假设:
readPath
返回true/false表示成功/失败- 失败时未分配
buffer
buffer
的解除定位器是free
问题的第二部分是long long
(或long long int
)的TYPEMAP。
通常CCD_ 7是至少32位,而CCD_。long
的默认类型映射是T_IV
。Perl对long long
的等价物也是T_IV
。
但有时,你不想减少对施法的警告。因此,您可以将T_LONG
用于long
。T_LONG
等效于T_IV
,但显式地将返回类型强制转换为long
。T_LONG
的TYPEMAP描述为$PERLLIB/ExtUtils/TYPEMAP
有了这些知识,您可以为long long int
:编写自己的TYPEMAP
TYPEMAP: <<TYPEMAPS
long long int T_LONGLONG
INPUT
T_LONGLONG
$var = (long long int)SvIV($arg)
OUTPUT
T_LONGLONG
sv_setiv($arg, (IV)$var);
TYPEMAPS