2014-10-29 3 views
5

Nach perlapi, sv_catpv() funktioniert wie folgt:Was ist der Unterschied zwischen sv_catpv() und sv_catpvs()?

verkettet die NUL terminierte Zeichenkette an das Ende der Zeichenkette, die in der SV ist. Wenn der SV den UTF-8-Status festgelegt hat, sollten die angehängten Byte gültige UTF-8 sein. Griffe erhalten Magie, aber keine Magie.

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

Die meisten der XS Tutorials, die ich gefunden habe, Verwendung sv_catpvs(), aber die tut dies:

Wie sv_catpvn, sondern nimmt eine Zeichenkette anstelle eines Strings/Länge Paar .

void sv_catpvs(SV* sv, const char* s)

Nun, das ist nicht sehr hilfreich, also lassen Sie sich bei sv_catpvn() aussehen:

verkettet die Zeichenfolge an das Ende der Zeichenfolge, die in dem SV ist. Die len gibt die Anzahl der zu kopierenden Bytes an. Wenn der SV den UTF-8-Status festgelegt hat, sollten die angehängten Byte gültige UTF-8 sein. Griffe erhalten Magie, aber keine Magie.

void sv_catpvn(SV *dsv, const char *sstr, STRLEN len)

So tut sv_catpvn das Gleiche wie sv_catpv, außer dass sie die Länge der Zeichenfolge als separate Parameter übernimmt, und sv_catpvs ist die gleiche wie sv_catpvn außer es die Zeichenkette nimmt.

Gibt es einen feinen Unterschied zwischen sv_catpv und sv_catpvs, die ich vermisse, oder sind es nur zwei Möglichkeiten, das Gleiche zu tun?

Antwort

6

Gemäß den von Ihnen zitierten Passagen nimmt sv_catpvs nur ein String-Literal.

const char *str = "foo"; 

sv_catpvs(sv, "foo"); // ok 
sv_catpvs(sv, str);  // ERROR 

sv_catpv, andererseits nimmt jeden Ausdruck, die einen String zurückgibt.

sv_catpv(sv, "foo"); // ok 
sv_catpv(sv, str);  // ok 

Warum gibt es überhaupt sv_catpvs? Weil es schneller ist. Der Grund sv_catpvs nimmt dauert nur eine Stringliteral ist, dass es ein Makro ist, den

sv_catpvn_flags(sv, "foo", sizeof("foo")-1, SV_GMAGIC) 

sv_catpvs(sv, "foo") 

in ähnlich etwas erweitert, die

sv_catpvn_flags(sv, "foo", 3, SV_GMAGIC) 

zur Compile-Zeit zu

löst. sv_catpv, auf der anderen Seite ist gezwungen, langsamer strlen zu verwenden.

+3

was bedeutet, dass sv_catpvs tatsächlich null Zeichen enthalten kann – ysth

+0

Ja, obwohl das ein unbeabsichtigter Nebeneffekt ist. – ikegami

Verwandte Themen