2010-08-24 14 views
22

मानक सी पुस्तकालय से काम करता है, स्ट्रिंग हेरफेर के लिए विशेष रूप से का एक बहुत है, और सबसे विशेष रूप से strcpy(), निम्न प्रोटोटाइप का हिस्सा:strcpy() वापसी मान

char *the_function (char *destination, ...) 

इनमें से वापसी मान कार्य वास्तव में प्रदान किए गए destination के समान हैं। आप अनावश्यक चीज़ के लिए वापसी मूल्य क्यों बर्बाद कर देंगे? इस तरह के एक समारोह को शून्य या कुछ उपयोगी लौटने के लिए यह अधिक समझ में आता है।

मेरे लिए ऐसा क्यों है के रूप में केवल अनुमान है कि यह आसान और घोंसला करने के लिए और अधिक सुविधाजनक एक और अभिव्यक्ति में समारोह कॉल है, उदाहरण के लिए है:

printf("%s\n", strcpy(dst, src)); 

क्या कोई अन्य समझदार कारणों यह मुहावरा सही ठहराने के लिए कर रहे हैं?

+10

आपका अनुमान सही है, लेकिन निश्चित रूप से हम सभी को इन कार्यों को समाप्त अशक्त बाइट के लिए सूचक लौटे इच्छा (जो 'हे (एन)' संचालन करने के लिए बहुत कम होगी 'हे (1)')। –

+0

एक बहुत ही सही अवलोकन। इतने सारे लोग सिर्फ एक strlen() की लागत का एहसास नहीं है। –

उत्तर

18

के रूप में इवान ने कहा, यह

char* s = strcpy(malloc(10), "test"); 

जैसे जैसे कुछ करने के लिए संभव है malloc()ed मेमोरी एक वैल्यू वैरिएबल का उपयोग किए बिना एक मान असाइन करें।

(इस उदाहरण सबसे अच्छा एक नहीं है, यह स्मृति की स्थिति से बाहर पर क्रैश हो जाएगा, लेकिन यह विचार स्पष्ट है) भी कोड के लिए बेहद आसान

+3

'char * s = strcpy (xmalloc (10, my_jmpbuf)," test ");' 'xmalloc' के साथ जो विफलता पर 'longjmp' निष्पादित करता है, यह मूर्खतापूर्ण सायन करेगा। –

+0

धन्यवाद योसियन, इस तरह से यह बहुत समझ में आता है। सामान्य रूप से, यदि गंतव्य तर्क एक अभिव्यक्ति है, तो वापसी मूल्य उपयोगी हो सकता है क्योंकि यह उस अभिव्यक्ति का मूल्यांकन परिणाम होगा। –

+0

संभव, हाँ, बहुत मूर्ख, निश्चित रूप से। एक सहायक चर से बचने की इच्छा इस तथ्य से बहुत दूर है कि आपका कार्यक्रम बुरी तरह से बम होगा। आप का उपयोग करना बेहतर होगा (या यहां तक ​​कि यदि आपके पास कोई नहीं है तो भी लिखना) 'strdup': http://stackoverflow.com/questions/252782/strdup-what-does-it-do-in-c/252802 # 252,802। – paxdiablo

3

मुझे विश्वास है कि आपका अनुमान सही है, यह कॉल को घोंसला करना आसान बनाता है।

1

इसकी।

वापसी मूल्य आमतौर पर एएक्स रजिस्टर में छोड़ा जाता है (यह अनिवार्य नहीं है, लेकिन यह अक्सर मामला है)। और समारोह शुरू होने पर गंतव्य को एएक्स रजिस्टर में रखा जाता है। गंतव्य वापस करने के लिए, प्रोग्रामर को करने की ज़रूरत है .... बिल्कुल कुछ भी नहीं! बस उस मूल्य को छोड़ दें जहां यह है।

प्रोग्रामर समारोह को void के रूप में घोषित कर सकता है। लेकिन वह वापसी मूल्य पहले से ही सही जगह पर है, बस लौटने की प्रतीक्षा कर रहा है, और इसे वापस करने के लिए अतिरिक्त निर्देश भी नहीं है! इससे कोई फर्क नहीं पड़ता कि सुधार कितना छोटा है, कुछ मामलों में यह आसान है।

+2

मजेदार, मुझे आईएसओ सी मानकों के दस्तावेज़ों में एएक्स रजिस्टर का कोई उल्लेख नहीं मिल सकता है :-) – paxdiablo

+0

क्योंकि वह विवरण कंपाइलर कार्यान्वयन से संबंधित है, जो कुछ आईएसओ मानक कवर नहीं करता है। यह x86 फ़ंक्शन कॉल सम्मेलन का हिस्सा है, जैसा कि [यहां] (https://en.wikipedia.org/wiki/X86_calling_conventions#x86-64_calling_conventions): "_Integer मान और मेमोरी पते EAX register_ में वापस आये हैं" – Fernando

0

Fluent Interfaces के समान ही अवधारणा। बस कोड को पढ़ने के लिए तेज़/आसान बनाना।

0

मुझे नहीं लगता कि यह वास्तव में घोंसले के उद्देश्यों के लिए इस तरह से स्थापित है, लेकिन त्रुटि जांच के लिए और अधिक है। अगर मेमोरी सी मानक लाइब्रेरी फ़ंक्शंस में से कोई भी सेवा नहीं करती है तो स्वयं को जांचने में बहुत अधिक त्रुटि होती है और इसके लिए यह अधिक समझ में आता है कि यह निर्धारित करना होगा कि स्ट्रैपी कॉल के दौरान कुछ ख़राब हो गया है या नहीं।

if(strcpy(dest, source) == NULL) { 
    // Something went horribly wrong, now we deal with it 
}