5

我几乎不知道 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 上。

顺便说一句——我还对 T_IV 使用了类型映射“long long int”。我找不到任何关于如何正确地输入 long long 的文档。有什么建议我应该如何长期打字?

谢谢,

4

2 回答 2

3

我从未从 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成功/失败返回真/假。
  • buffer不分配失败。
  • 的释放器bufferfree.
于 2012-07-22T04:50:33.047 回答
1

问题的第二部分是long long(或long long int)的 TYPEMAP。

通常long至少为 32 位,long long至少为 64 位。默认类型映射longT_IV. Perl 的等价于long longis T_IV,也是。

但有时,你不想减少演员阵容的警告。因此,您可以使用T_LONGfor longT_LONG等效于T_IV但显式地将返回值强制转换为 type long。TYPEMAP 的T_LONG描述在 $PERLLIB/ExtUtils/typemap

有了这些知识,您可以编写自己的 TYPEMAP long long int

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
于 2019-11-18T06:31:18.913 回答