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

Dar*_*ord 5 perl xs

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

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

void sv_catpv(SV *const sv, const char* ptr)

sv_catpvs()不过我发现的大多数XS教程都使用了这个:

喜欢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_catpvsv_catpvs我失踪,或者他们只是两种方法做同样的事情?

ike*_*ami 6

根据您引用的段落,sv_catpvs只需要一个字符串文字.

const char *str = "foo";

sv_catpvs(sv, "foo");   // ok
sv_catpvs(sv, str);     // ERROR
Run Code Online (Sandbox Code Playgroud)

sv_catpv另一方面,接受任何返回字符串的表达式.

sv_catpv(sv, "foo");    // ok
sv_catpv(sv, str);      // ok
Run Code Online (Sandbox Code Playgroud)

那么为什么sv_catpvs存在呢?因为它更快.原因sv_catpvs只需要一个字符串文字就是它是一个扩展的宏

sv_catpvs(sv, "foo")
Run Code Online (Sandbox Code Playgroud)

变成类似的东西

sv_catpvn_flags(sv, "foo", sizeof("foo")-1, SV_GMAGIC)
Run Code Online (Sandbox Code Playgroud)

哪个解决了

sv_catpvn_flags(sv, "foo", 3, SV_GMAGIC)
Run Code Online (Sandbox Code Playgroud)

在编译时.sv_catpv另一方面,被迫使用较慢strlen.

  • 这意味着sv_catpvs实际上可以包含空字符 (3认同)