2014-10-29 9 views
5
perlapi के अनुसार

, sv_catpv() काम करता है इस प्रकार है:sv_catpv() और sv_catpvs() के बीच क्या अंतर है?

concatenates NUL -terminated स्ट्रिंग स्ट्रिंग जो एसवी में है के अंत पर। यदि एसवी में यूटीएफ -8 स्थिति सेट है, तो संलग्न बाइट वैध यूटीएफ -8 होना चाहिए। जादू 'हैंडल' हैं, लेकिन 'सेट' जादू नहीं है।

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

XS ट्यूटोरियल मैं उपयोग sv_catpvs() पाया है में से अधिकांश, हालांकि, जो करता है यह:

sv_catpvn तरह

बल्कि एक स्ट्रिंग/लंबाई जोड़ी के बजाय एक शाब्दिक स्ट्रिंग लेता है ।

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

ठीक है, कि बहुत मददगार नहीं है, तो चलो sv_catpvn() को देखो: स्ट्रिंग जो एसवी में है के अंत पर

concatenates स्ट्रिंग। len कॉपी करने के लिए बाइट्स की संख्या इंगित करता है। यदि एसवी में यूटीएफ -8 स्थिति सेट है, तो संलग्न बाइट वैध यूटीएफ -8 होना चाहिए। जादू 'हैंडल' हैं, लेकिन 'सेट' जादू नहीं है।

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

तो, sv_catpvn को छोड़कर यह एक अलग पैरामीटर के रूप में स्ट्रिंग लंबाई लेता है कि sv_catpv के रूप में एक ही बात करता है, और sv_catpvssv_catpvn रूप में एक ही है, सिवाय इसके कि यह शाब्दिक स्ट्रिंग लेता है।

वहाँ sv_catpv और sv_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_catpvs(sv, "foo") 

फैलता

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

जो संकलन समय पर

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

ले कर जाता है करने के लिए है एक स्ट्रिंग लेता है। दूसरी ओर, sv_catpv, धीमी strlen का उपयोग करने के लिए मजबूर होना पड़ता है।

+3

जिसका अर्थ है sv_catpvs वास्तव में शून्य वर्ण – ysth

+0

हां शामिल कर सकते हैं, हालांकि यह एक अनजान दुष्प्रभाव है। – ikegami

संबंधित मुद्दे