2010-08-11 19 views

उत्तर

115
  • वापसी भाषा है कि एक समारोह कॉल से लौटने के एक निर्देश है।
  • बाहर निकलें एक सिस्टम कॉल (एक भाषा कथन नहीं है) जो वर्तमान प्रक्रिया को समाप्त करता है।

केवल मामला है जब दोनों (लगभग) एक ही बात के रूप में मुख्य रूप से एक वापसी एक exit() करता है, main() समारोह में है।

return साथ उदाहरण:

#include <stdio.h> 

void f(){ 
    printf("Executing f\n"); 
    return; 
} 

int main(){ 
    f(); 
    printf("Back from f\n"); 
} 

आप इस कार्यक्रम पर अमल तो यह प्रिंट:

Executing f 
Back from f 

exit() के लिए एक और उदाहरण:

#include <stdio.h> 
#include <stdlib.h> 

void f(){ 
    printf("Executing f\n"); 
    exit(0); 
} 

int main(){ 
    f(); 
    printf("Back from f\n"); 
} 

आप इस कार्यक्रम पर अमल तो यह प्रिंट:

Executing f 

आप कभी नहीं मिल "वापस च से"। लाइब्रेरी फ़ंक्शन exit() पर कॉल करने के लिए आवश्यक #include <stdlib.h> पर भी ध्यान दें।

यह भी ध्यान दें कि exit() का पैरामीटर एक पूर्णांक है (यह प्रक्रिया की वापसी स्थिति है जो लॉन्चर प्रक्रिया प्राप्त कर सकती है; परंपरागत उपयोग सफलता के लिए 0 है या किसी त्रुटि के लिए कोई अन्य मान है)।

रिटर्न स्टेटमेंट का पैरामीटर जो भी कार्य का रिटर्न प्रकार है। यदि फ़ंक्शन शून्य हो जाता है, तो आप फ़ंक्शन के अंत में वापसी को छोड़ सकते हैं।

अंतिम बिंदु, exit() दो स्वादों में _exit() और exit() में आते हैं। रूपों के बीच अंतर exit() (मुख्य से वापसी) कहता है कि कार्यों वास्तव में प्रक्रिया समाप्त करते हुए _exit() (#include <unistd.h>, या #include <stdlib.h> से अपने पर्याय _Exit से) तुरंत प्रक्रिया समाप्त हो जाता है इससे पहले कि atexit() या on_exit() का उपयोग कर पंजीकृत है।

अब ऐसे मुद्दे भी हैं जो सी ++ के लिए विशिष्ट हैं।

सी ++ कार्यों से बाहर निकलने पर सी से अधिक काम करता है (return -ing)। विशेष रूप से यह दायरे से बाहर जाने वाली स्थानीय वस्तुओं के विनाशकों को बुलाता है। अधिकांश मामलों में प्रोग्रामर प्रक्रिया के बंद होने के बाद प्रोग्राम की स्थिति की अधिक परवाह नहीं करेंगे, इसलिए इससे कोई फर्क नहीं पड़ता: आवंटित स्मृति मुक्त हो जाएगी, फाइल रिसोर्स बंद हो जाएगी और इसी तरह। लेकिन इससे कोई फर्क नहीं पड़ता कि आपका विनाशक आईओ करता है। उदाहरण के लिए स्वचालित रूप से बनाए गए स्वचालित C++ OStream को बाहर निकलने के लिए कॉल पर फ़्लश नहीं किया जाएगा और आप कुछ अप्रचलित डेटा खो सकते हैं (दूसरी तरफ स्थिर OStream फ़्लश किया जाएगा)।

यदि आप पुराने पुराने सी FILE* स्ट्रीम का उपयोग कर रहे हैं तो ऐसा नहीं होगा। इन्हें exit() पर फ़्लश किया जाएगा। असल में, नियम वही है कि पंजीकृत निकास कार्यों के लिए, FILE* सभी सामान्य समाप्ति पर फ़्लश किया जाएगा, जिसमें exit() शामिल है, लेकिन _exit() या निरस्त() को कॉल नहीं किया गया है।

आपको यह भी ध्यान में रखना चाहिए कि सी ++ फ़ंक्शन से बाहर निकलने का तीसरा तरीका प्रदान करता है: अपवाद फेंकना। फ़ंक्शन से बाहर जाने का यह तरीका कॉल विनाशक होगा। यदि यह कॉलर्स की श्रृंखला में कहीं भी नहीं पकड़ा जाता है, तो अपवाद मुख्य() फ़ंक्शन तक जा सकता है और प्रक्रिया को समाप्त कर सकता है।

स्थिर सी ++ ऑब्जेक्ट्स (ग्लोबल्स) के विनाशक को या exit() से कहीं भी अपने प्रोग्राम में कॉल किया जाएगा। यदि _exit() या abort() का उपयोग कर प्रोग्राम समाप्त कर दिया गया है तो उन्हें बुलाया नहीं जाएगा। abort() अधिकतर कार्यक्रम को तुरंत रोकने और एक स्टैक ट्रेस (पोस्ट मॉर्टम विश्लेषण के लिए) प्राप्त करने के उद्देश्य से डीबग मोड में अधिक उपयोगी है। यह आमतौर पर assert() मैक्रो के पीछे छिपी हुई मोड में सक्रिय है।

बाहर निकलने पर() उपयोगी कब होता है?

exit() का अर्थ है कि आप तुरंत वर्तमान प्रक्रिया को रोकना चाहते हैं। यह त्रुटि प्रबंधन के लिए कुछ उपयोग हो सकता है जब हमें किसी प्रकार का अपरिवर्तनीय समस्या आती है जो आपके कोड को और भी उपयोगी बनाने की अनुमति नहीं देगी। नियंत्रण प्रवाह जटिल होने पर अक्सर यह आसान होता है और त्रुटि कोड को सभी तरह से प्रचारित किया जाना चाहिए। लेकिन ध्यान रखें कि यह खराब कोडिंग अभ्यास है। प्रक्रिया को धीरे-धीरे समाप्त करना ज्यादातर मामलों में खराब व्यवहार और वास्तविक त्रुटि प्रबंधन को प्राथमिकता दी जानी चाहिए (या अपवादों का उपयोग करके सी ++ में)।

exit() पर डायरेक्ट कॉल लाइब्रेरी में किए जाने पर विशेष रूप से खराब होते हैं क्योंकि यह लाइब्रेरी उपयोगकर्ता को नष्ट कर देगा और यह किसी प्रकार की त्रुटि पुनर्प्राप्ति को लागू करने के लिए लाइब्रेरी उपयोगकर्ता की पसंद होनी चाहिए या नहीं। यदि आप एक उदाहरण चाहते हैं कि लाइब्रेरी से exit() क्यों बुला रहा है, तो यह उदाहरण देता है कि लोग this question से पूछें।

ऑपरेटिंग सिस्टम पर फोर्क() द्वारा शुरू की गई बाल प्रक्रिया को समाप्त करने के तरीके के रूप में exit() का एक निर्विवाद वैध उपयोग है। फोर्क() से पहले कोड पर वापस जाना आमतौर पर एक बुरा विचार है। यह तर्क बता रहा है कि क्यों निष्पादन() परिवार का कार्य कभी कॉलर पर वापस नहीं आएगा।

+6

बाहर निकलने की आवश्यकता है() एक सिस्टम कॉल नहीं है –

+0

@anon: आप सही हैं, तकनीकी रूप से यह सिस्टम पर वापसी है, लेकिन इसमें कोई फर्क नहीं पड़ता है। – kriss

+0

@ जोनाथन लेफ्लर 'मुख्य()' में 'वापसी' या 'निकास' का उपयोग करना पसंद किया जाता है? उदाहरण के लिए देखो [THIS] (https://gist.github.com/anonymous/c293fbd346a534912e69) कोड। –

10

सी में, वहाँ बहुत अंतर नहीं है जब कार्यक्रम (जो main(), wmain(), _tmain() या डिफ़ॉल्ट अपने संकलक द्वारा इस्तेमाल किया नाम हो सकता है) के स्टार्टअप समारोह में इस्तेमाल किया।

आप returnmain() में, नियंत्रण वापस सी पुस्तकालय में _start() समारोह जो मूल रूप से अपने कार्यक्रम है, जो तब exit() कॉल वैसे भी शुरू कर दिया है करने के लिए चला जाता है। तो यह वास्तव में कोई फर्क नहीं पड़ता कि आप किस का उपयोग करते हैं।

+1

इससे कोई फर्क नहीं पड़ता। बाहर निकलें() तुरंत कार्यक्रम को समाप्त करता है, इससे कोई फर्क नहीं पड़ता कि इसे कहां कहा जाता है। वापसी केवल वर्तमान समारोह से बाहर निकलती है। एकमात्र स्थान वे एक ही चीज करते हैं मुख्य में() – Amy

+0

धन्यवाद, मैंने शब्द तय कर दिया है। यह केवल मुख्य() में जरूरी नहीं है, क्योंकि सभी कंपाइलर स्टार्टअप फ़ंक्शन के लिए समान फ़ंक्शन नाम का उपयोग नहीं करते हैं। –

+7

मुझे लगता है कि आप अपने सभी कार्यक्रमों को एक बड़े मुख्य समारोह में लिखते हैं? ;-) –

13

मैं दो कार्यक्रमों लिखा है:

int main(){return 0;} 

और

#include <stdlib.h> 
int main(){exit(0)} 

gcc -S -O1 को क्रियान्वित करने के बाद।

main: 
    movl $0, %eax /* setting return value */ 
    ret     /* return from main */ 

और

main: 
    subq $8, %rsp /* reserving some space */ 
    movl $0, %edi /* setting return value */ 
    call exit  /* calling exit function */ 
         /* magic and machine specific wizardry after this call */ 

तो मेरा निष्कर्ष यह है: का उपयोग return जब आप कर सकते हैं, और exit() जब आप की जरूरत है मैं यहाँ विधानसभा में देख (केवल महत्वपूर्ण भागों) में पाया गया।

1

वर्तमान समारोह और बाहर निकलें (से वापसी कथन निकास) ने एक बयान है कार्यक्रम

they are the same when used in main() function 

की भी वापसी हुई से बाहर निकल जाता है, जबकि बाहर निकलने के() एक समारोह जो stdlb.h हेडर फाइल

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