2014-10-29 17 views
5

, sv_catpv() aşağıdaki gibi çalışır: SV olduğu dizenin sonuna üzerinesv_catpv() ve sv_catpvs() arasındaki fark nedir? <a href="http://perldoc.perl.org/perlapi.html#SV-Body-Allocation">perlapi</a> göre

bitiştirir NUL nihayetti dize. SV, UTF-8 durum kümesine sahipse, eklenen baytların geçerli UTF-8 olması gerekir. Kolları 'almak' büyü, ama 'set' büyü değil. sv_catpvn gibi

ama bir dize/uzunluk çiftinin yerine değişmez dize alır: does bu olsa

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

ben kullanacağım sv_catpvs() buldum XS öğreticiler çoğu, .

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

Bu çok yararlı değil, o yüzden sv_catpvn() bakalım:

bitiştirir dize SV olduğu dizenin sonuna üzerine. len, kopyalanacak bayt sayısını gösterir. SV, UTF-8 durum kümesine sahipse, eklenen baytların geçerli UTF-8 olması gerekir. Kolları 'almak' büyü, ama 'set' büyü değil.

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

Yani, sv_catpvn ayrı bir parametre olarak dize uzunluğunu alır dışında sv_catpv aynı şeyi yapar ve edebi dize almasıdır sv_catpvs sv_catpvn aynıdır.

Eksik olduğum sv_catpv ve sv_catpvs arasında bazı ince farklar var mı, yoksa aynı şeyi yapmanın iki yolu mu?

cevap

6

Aldığınız geçişlere göre, sv_catpvs sadece bir dize değişmezi alır.

const char *str = "foo"; 

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

sv_catpv

, diğer taraftan, bir dize döndürür herhangi bir ifade kabul eder.

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

Peki neden sv_catpvs hiç var mı? Çünkü daha hızlı. nedeni sv_catpvs literal o derleme sırasında

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

olarak çözümlenir

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

benzer bir şey haline

sv_catpvs(sv, "foo") 

genişleyen bir makro olmasıdır yalnızca alır bir dize alır. Diğer yandan, sv_catpv, daha yavaş olan strlen'u kullanmak zorunda kalmaktadır.

+3

sv_catpvs'nin aslında null karakterleri içerebileceği anlamına gelir – ysth

+0

Evet, ancak bu istenmeyen bir yan etkidir. – ikegami