根据perlapi,sv_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_catpvn
与sv_catpv
的功能相同,只是它将字符串长度作为单独的参数,sv_catpvs
与sv_catpvn
相同,但需要sv_catpv
文字字符串。
我遗漏的sv_catpvs
和{{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
。