2014-10-29 6 views
5

에 따르면, 다음과 같이 작동 sv_catpv() 다음 SV에 문자열의 단부 상sv_catpv()와 sv_catpvs()의 차이점은 무엇입니까? <a href="http://perldoc.perl.org/perlapi.html#SV-Body-Allocation">perlapi</a>

연접 NUL로 끝나는 문자열. SV가 UTF-8 상태 세트를 가지고 있으면 추가 된 바이트는 유효한 UTF-8이어야합니다. 'get'마법을 처리하지만 'set'마법은 사용하지 않습니다. sv_catpvn처럼

하지만, 문자열/길이 쌍 대신 리터럴 문자열을 취 수행이 비록

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

내가 사용 sv_catpvs()을 찾은 XS 자습서의 대부분을, .

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

글쎄, 그건 매우 도움이 아니에요, 그래서 sv_catpvn() 살펴 보자 :

을 병합 문자열을 SV에있는 문자열의 끝에. len은 복사 할 바이트 수를 나타냅니다. SV가 UTF-8 상태 세트를 가지고 있으면 추가 된 바이트는 유효한 UTF-8이어야합니다. 'get'마법을 처리하지만 'set'마법은 사용하지 않습니다.

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

그래서, sv_catpvn은 별도의 매개 변수로 문자열 길이를 취한다는 점을 제외 sv_catpv과 같은 일을하고 리터럴 문자열을 사용 제외 sv_catpvssv_catpvn과 동일합니다.

내가 누락 된 sv_catpvsv_catpvs 사이에 약간의 차이가 있습니까? 아니면 같은 것을하기위한 두 가지 방법이 있습니까?

답변

6

인용 한 구절에 따라 sv_catpvs은 문자열 리터럴 만 사용합니다.

const char *str = "foo"; 

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

sv_catpv

, 다른 한편으로는, 문자열을 반환하는 모든 표현을 허용합니다.

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

그럼 sv_catpvs은 왜 존재합니까? 그것은 더 빠르기 때문에. 그 이유 sv_catpvs는 리터럴은 컴파일 시간에

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

로 확인

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

비슷한 무언가로

sv_catpvs(sv, "foo") 

을 확장 매크로 있다고 만 소요 문자열을 사용합니다. 반면에 sv_catpv은 느린 strlen을 사용해야합니다.

+3

즉, sv_catpvs에 실제로 null 문자가 포함될 수 있음을 의미합니다. – ysth

+0

예, 의도하지 않은 부작용입니다. – ikegami