根据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_catpv和sv_catpvs我失踪,或者他们只是两种方法做同样的事情?
根据您引用的段落,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.
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |