sv_catpv()和sv_catpvs()之间有什么区别?

时间:2014-10-29 17:58:20

标签: perl xs

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

  

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

     

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。处理'获得'魔法,但不是'设置'魔法。

     

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

因此,sv_catpvnsv_catpv的功能相同,只是它将字符串长度作为单独的参数,sv_catpvssv_catpvn相同,但需要sv_catpv文字字符串。

我遗漏的sv_catpvs和{{1}}之间是否存在细微差别,或者只是两种方法可以做同样的事情?

1 个答案:

答案 0 :(得分: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