PerlXS和C++将指针传递到缓冲区



我几乎不懂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用于longT_LONG等效于T_IV,但显式地将返回类型强制转换为longT_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

相关内容

  • 没有找到相关文章

最新更新