gpt4 book ai didi

perl - 如何将字符串参数的长度传递给 XS 中的 CODE 部分?

转载 作者:行者123 更新时间:2023-12-01 03:15:00 25 4
gpt4 key购买 nike

在 XS 中,我可以使用 length keyword 将字符串参数的长度传递给 C 函数。 :

static int foo(const char *s, size_t len)
{
return 1;
}

MODULE = Foo PACKAGE = Foo

void
foo(char *s, STRLEN length(s))

但是,如果我在 CODE block 中需要它,如何获取字符串的长度?
void
foo(char *s, STRLEN length(s))
CODE:
...
foo(s, ???);

我可以使用 STRLEN_length_of_sXSauto_length_of_s变量自动生成
由 xsubpp 提供,但感觉有点硬编码。有没有办法(可能是预定义的宏)可以用来获取变量名?或者我可以将我自己的名字分配给长度参数吗?还是我需要诉诸将参数声明为 SV *然后自己用 SvPV得到长度在代码部分?

最佳答案

首先,如果您使用的是 char*在您的 XS 原型(prototype)(和默认类型映射)中,您的代码有问题。

你要

void
foo(SV* sv)
PREINIT:
STRLEN len;
char* s;
CODE:
s = SvPVbyte(sv, len);
foo(s, len);

或者
void
foo(SV* sv)
PREINIT:
STRLEN len;
char* s;
CODE:
s = SvPVutf8(sv, len);
foo(s, len);

请记住,Perl 字符串是 32 位或 64 位数字的序列,而 C 字符串是 8 位字符的序列。 [1]需要进行一些转换,您需要指定哪一个。

在第一种情况下,字符串的每个字符都是 chars .

在第二种情况下, s将提供使用 utf8 编码的 Perl 字符串。

  • 从技术上讲,char可以大于 8 位,但我不认为它可以在 perl 支持的系统上.
  • 关于perl - 如何将字符串参数的长度传递给 XS 中的 CODE 部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49151872/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com