Perl 什么';sv_catpv()和sv_catpvs()之间的区别是什么?
根据sv_catpv()的工作原理如下: 将以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)
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实际上可以包含空字符