5

根据perlapisv_catpv()工作原理如下:

NUL将- 终止的字符串连接到 SV 中字符串的末尾。如果 SV 设置了 UTF-8 状态,则附加的字节应该是有效的 UTF-8。处理“get”魔法,但不处理“set”魔法。

void sv_catpv(SV *const sv, const char* ptr)

不过,我发现的大多数 XS 教程都使用sv_catpvs()了 ,它是这样做的:

类似sv_catpvn,但采用文字字符串而不是字符串/长度对。

void sv_catpvs(SV* sv, const char* s)

好吧,这不是很有帮助,所以让我们看一下sv_catpvn()

将字符串连接到 SV 中字符串的末尾。指示要复制的len字节数。如果 SV 设置了 UTF-8 状态,则附加的字节应该是有效的 UTF-8。处理“get”魔法,但不处理“set”魔法。

void sv_catpvn(SV *dsv, const char *sstr, STRLEN len)

因此,除了将字符串长度作为单独的参数外,它的作用与它sv_catpvn相同,除了它采用文字字符串外。sv_catpvsv_catpvssv_catpvn

sv_catpv和我之间是否有一些微妙的区别sv_catpvs,或者它们只是做同一件事的两种方法?

4

1 回答 1

6

根据您引用的段落,sv_catpvs只需要一个字符串文字。

const char *str = "foo";

sv_catpvs(sv, "foo");   // ok
sv_catpvs(sv, str);     // ERROR

sv_catpv另一方面,接受任何返回字符串的表达式。

sv_catpv(sv, "foo");    // ok
sv_catpv(sv, str);      // ok

那么为什么sv_catpvs存在呢?因为它更快。sv_catpvs只需要一个字符串文字的原因是它是一个扩展的宏

sv_catpvs(sv, "foo")

变成类似的东西

sv_catpvn_flags(sv, "foo", sizeof("foo")-1, SV_GMAGIC)

解决为

sv_catpvn_flags(sv, "foo", 3, SV_GMAGIC)

在编译时。sv_catpv,另一方面,被迫使用较慢strlen的 .

于 2014-10-29T18:37:33.203 回答