根据perlapi,sv_catpv()
的工作方式如下:
我发现的大多数XS教程都使用sv_catpvs()
,这样做是:
好吧,这不是很有帮助,所以让我们看一下sv_catpvn()
:
因此,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)
在编译时。另一方面,
sv_catpv
被迫使用较慢的strlen
。关于perl - sv_catpv()和sv_catpvs()有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26637496/