2014-10-29 6 views
5

Secondo perlapi, sv_catpv() funziona nel modo seguente:Qual è la differenza tra sv_catpv() e sv_catpvs()?

concatena i NUL -terminated stringa alla fine della stringa, che è in SV. Se SV ha impostato lo stato UTF-8, i byte aggiunti dovrebbero essere UTF-8 validi. Le maniglie "ottengono" la magia, ma non la magia "fissa".

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

La maggior parte dei tutorial XS che ho trovato l'uso sv_catpvs(), però, che fa questo:

Come sv_catpvn, ma prende una stringa letterale invece di una coppia di stringa/lunghezza .

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

Beh, questo non è molto utile, quindi diamo un'occhiata a sv_catpvn():

Concatena la stringa alla fine della stringa, che è in SV. len indica il numero di byte da copiare. Se SV ha impostato lo stato UTF-8, i byte aggiunti dovrebbero essere UTF-8 validi. Le maniglie "ottengono" la magia, ma non la magia "fissa".

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

Quindi, sv_catpvn fa la stessa cosa di sv_catpv la differenza che accetta la lunghezza della stringa come un parametro a parte, e sv_catpvs è uguale a sv_catpvn tranne che prende la stringa letterale.

C'è qualche sottile differenza tra sv_catpv e sv_catpvs che mi manca, o sono solo due modi per fare la stessa cosa?

risposta

6

Come per i passaggi citati, sv_catpvs richiede solo una stringa letterale.

const char *str = "foo"; 

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

sv_catpv, d'altra parte, accetta qualsiasi espressione che restituisce una stringa.

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

Quindi perché esiste lo sv_catpvs? Perché è più veloce. Il motivo sv_catpvs richiede solo prende una stringa letterale è che è una macro che si espande

sv_catpvs(sv, "foo") 

in qualcosa di simile a

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

che si risolve a

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

a tempo di compilazione. sv_catpv, d'altra parte, è costretto a utilizzare più lentamente strlen.

+3

che significa che sv_catpvs può effettivamente includere caratteri null – ysth

+0

Sì, anche se questo è un effetto collaterale involontario. – ikegami