Perl 什么';sv_catpv()和sv_catpvs()之间的区别是什么?

Perl 什么';sv_catpv()和sv_catpvs()之间的区别是什么?,perl,xs,Perl,Xs,根据sv_catpv()的工作原理如下: 将以NUL结尾的字符串连接到SV中字符串的末尾。如果SV设置了UTF-8状态,则附加的字节应为有效的UTF-8。处理“获取”魔法,但不处理“设置”魔法 void sv\u catpv(sv*const sv,const char*ptr) 不过,我发现的大多数XS教程都使用了sv_catpvs(),它实现了以下功能: 类似于sv_catpvn,但采用文本字符串而不是字符串/长度对 void sv\u catpvs(sv*sv,const char*s)

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

将以
NUL
结尾的字符串连接到SV中字符串的末尾。如果SV设置了UTF-8状态,则附加的字节应为有效的UTF-8。处理“获取”魔法,但不处理“设置”魔法

void sv\u catpv(sv*const sv,const char*ptr)

不过,我发现的大多数XS教程都使用了
sv_catpvs()
,它实现了以下功能:

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

void sv\u catpvs(sv*sv,const char*s)

好吧,这不是很有帮助,所以让我们看看
sv\u catpvn()

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

void sv\u catpvn(sv*dsv,const char*sstr,STRLEN len)

因此,
sv_catpvn
的作用与
sv_catpv
相同,只是它将字符串长度作为一个单独的参数,
sv_catpvs
sv_catpvn
相同,只是它采用了文本字符串


sv_catpv
sv_catpvs
之间有什么细微的区别吗?或者它们只是做同一件事的两种方法?

根据你引用的段落,
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)

在编译时<另一方面,code>sv_catpv被迫使用较慢的strlen

,这意味着sv_catpv实际上可以包含空字符