C और C ++ में मुख्य () वापसी क्या होनी चाहिए?


695

सही (सबसे कुशल) जिस तरह से परिभाषित करने के लिए क्या है main()- सी और C ++ समारोह int main()या void main()- और क्यों? अगर या int main()तो ?return 1return 0


इस प्रश्न के कई डुप्लिकेट हैं, जिनमें शामिल हैं:

सम्बंधित:


28
मुझे अभी भी लगता है कि यह काफी अस्पष्ट है। मेरे लिए "सबसे कुशल" परिभाषित करें। किस अर्थ में कुशल? कम स्मृति लेने के अर्थ में? तेज दौड़ने के अर्थ में? मैं उपयोगी उत्तर देख सकता हूं लेकिन मुझे अभी भी लगता है कि प्रश्न बहुत खराब तरीके से बनाया गया है।
ओनोरियो कैटेनेशिया

7
पॉश पॉश, कुशल का संदर्भ यहां स्पष्ट है, विशेष रूप से उदाहरणों के साथ (जो 'कुशल' की परिभाषा को स्पष्ट करने की संभावना है)। उम्मीद है कि गरीब बफर एक छेद में क्रॉल नहीं किया था और पूरी तरह से सवाल का पछतावा था। कोई यह कह सकता है कि शून्य या इंट की परवाह किए बिना, एक मान लौटाया जाता है, इसलिए इसका फ़ाइल आकार, प्रचालनों पर कोई प्रभाव नहीं पड़ता है, न ही मेमोरी आवंटित होती है। और लोग, अधिकांश OS पर, सफलता की ओर 0 लौटाते हैं, और कुछ और, पर-सफलता, या असफलता - लेकिन कोई मानक नहीं है। अंततः, किसी भी स्पष्ट तरीके से दक्षता में कोई अंतर नहीं है।
किट

"सही (सबसे कुशल)" समझ में नहीं आता है। कुशल एक चीज है, सही दूसरा है। mainएक बार कहा जाता है (और सी ++ में केवल एक बार बुलाया जा सकता है: कोई पुनरावृत्ति नहीं)। यदि आप बहुत समय बिताने के लिए निष्पादन नहीं चाहते हैं main, तो कार्यक्रम को बड़ी संख्या में लागू न करें: कार्यक्रम को दोहराव को लागू करें।
काज

2
मैं इसे, जवाब में से कोई भी दिलचस्प जहाँ तक मैं बता सकता हूँ मिल जाए, एक पूरी तरह से काम कर रहे उदाहरण प्रदान, सहित #includeबयान
PUK

3
रिटर्न मान बिना ओएस वाले प्लेटफॉर्म पर कोई मतलब नहीं रखते हैं। तुम कुछ भी नहीं लौटा रहे हो। यदि आप एक हिट returnमें main(...)एक एम्बेडेड डिवाइस पर, अपने सिस्टम में पूर्वानुमान लगाना कठिन राज्य में चला जाता है और अपने कपड़े धोने की मशीन स्वयं जागरूक हो और आप को मारने के लिए कोशिश करेंगे। तो, हम void main()उस मामले में उपयोग करते हैं । यह नंगे-धातु एम्बेडेड में उद्योग मानक अभ्यास है।
डी जुवे

जवाबों:


570

वापसी मान mainइंगित करता है कि कार्यक्रम कैसे बाहर निकल गया। सामान्य निकास को 0 रिटर्न मान से दर्शाया जाता है main। गैर-शून्य रिटर्न द्वारा असामान्य निकास का संकेत दिया जाता है, लेकिन गैर-शून्य कोड की व्याख्या कैसे की जाती है, इसके लिए कोई मानक नहीं है। जैसा कि दूसरों ने नोट किया है, void main()सी ++ मानक द्वारा निषिद्ध है और इसका उपयोग नहीं किया जाना चाहिए। मान्य C ++ mainहस्ताक्षर हैं:

int main()

तथा

int main(int argc, char* argv[])

जो के बराबर है

int main(int argc, char** argv)

यह भी ध्यान देने योग्य है कि C ++ में, int main()रिटर्न-स्टेटमेंट के बिना छोड़ा जा सकता है, जिस बिंदु पर यह लौटने में चूक करता है 0. यह C99 प्रोग्राम के साथ भी सही है। कि क्याreturn 0; या छोड़ देना चाहिए नहीं बहस के लिए खुला है। मान्य सी प्रोग्राम मुख्य हस्ताक्षरों की सीमा कहीं अधिक है।

mainकार्यक्षमता कार्य के साथ कोई समस्या नहीं है। इसे केवल C ++ मानक के अनुसार एक बार दर्ज किया और छोड़ा जा सकता है (प्रोग्राम की शुरुआत और समाप्ति को चिह्नित करते हुए)। सी के लिए, पुन: प्रवेश main()की अनुमति है, लेकिन इससे बचा जाना चाहिए।


69
मुख्य को कई बार दर्ज किया जा सकता है / छोड़ा जा सकता है, लेकिन यह प्रोग्राम शायद कोई भी डिज़ाइन पुरस्कार नहीं जीत सकता है;)
कोरोना

13
C99 में C ++ गलत-विशेषता भी है जो मुख्य () फ़ंक्शन के अंत तक पहुँचने के लिए 0 लौटने के बराबर है - यदि मुख्य () int के साथ संगत प्रकार वापस करने के लिए परिभाषित किया गया है (अनुभाग 5.1.2.2.3)।
जोनाथन लेफ़लर

62
मुख्य reentering मान्य नहीं है C ++। मानक रूप से स्पष्ट रूप से, 3.6.1.3 राज्यों के 'एक कार्यक्रम के भीतर मुख्य उपयोग नहीं किया जाएगा'
वर्कमैड 3

117
stdlib.h इस उद्देश्य के लिए EXIT_SUCCESS और EXIT_FAILURE प्रदान करता है
क्ले

20
0 और गैर-शून्य सही हैं लेकिन आपके कोड को पढ़ने वाले किसी व्यक्ति के लिए पूरी तरह से अर्थहीन हैं। यह प्रश्न इस बात का प्रमाण है कि लोग यह नहीं जानते कि मान्य / अमान्य कोड क्या हैं। EXIT_SUCCESS / EXIT_FAILURE बहुत अधिक स्पष्ट हैं।
JaredPar

169

स्वीकृत उत्तर C ++ के लिए लक्षित किया गया प्रतीत होता है, इसलिए मैंने सोचा कि मैं एक उत्तर जोड़ूंगा जो C से संबंधित है, और यह कुछ तरीकों से भिन्न है।

आईएसओ / आईईसी 9899: 1989 (C90):

main() या तो घोषित किया जाना चाहिए:

int main(void)
int main(int argc, char **argv)

या उसके बराबर। उदाहरण के लिए, int main(int argc, char *argv[])दूसरे के बराबर है। इसके अलावा, intवापसी प्रकार को छोड़ा जा सकता है क्योंकि यह एक डिफ़ॉल्ट है।

यदि कोई कार्यान्वयन इसकी अनुमति देता है, main() अन्य तरीकों से घोषित किया जा सकता है, लेकिन यह कार्यक्रम के कार्यान्वयन को परिभाषित करता है, और अब सख्ती से अनुरूप नहीं है।

मानक 3 मानों को लौटने के लिए परिभाषित करता है जो कड़ाई से अनुरूप होते हैं (यानी, कार्यान्वयन परिभाषित व्यवहार पर भरोसा नहीं करता है): 0और EXIT_SUCCESSएक सफल समाप्ति के लिए, और EXIT_FAILUREएक असफल समाप्ति के लिए। कोई भी अन्य मान गैर-मानक और कार्यान्वयन परिभाषित हैं। अपरिभाषित व्यवहार से बचने के लिए अंत में main()एक स्पष्ट returnकथन होना चाहिए ।

अंत में, main()एक कार्यक्रम से कॉल करने के साथ मानकों के दृष्टिकोण से कुछ भी गलत नहीं है ।

आईएसओ / आईईसी 9899: 1999 (C99):

C99 के लिए, ऊपर के अलावा सब कुछ समान है:

  • intवापसी प्रकार लोप नहीं किया जा सकता।
  • आप वापसी विवरण को छोड़ सकते हैं main()। यदि आप करते हैं, और main()समाप्त हो गया है, तो एक निहित है return 0

1
@ लुंडिन मुझे नहीं लगता कि आपको यह कहने के लिए एक उद्धरण की आवश्यकता है कि किसी को एक संकलक बनाने की अनुमति है जो गैर-मानक-अनुरूप कार्यक्रमों को स्वीकार करता है, या एक गैर-स्टार्डर्ड-अनुरूप संकलक है। यह सामान्य ज्ञान और सामान्य ज्ञान है
KABoissonneault

4
@KABoissonneault कार्यान्वयन-परिभाषित व्यवहार मानक से एक शब्द है, जैसा कि पूरी तरह से अनैच्छिक व्यवहार के विपरीत है। यदि आप किसी ऐसी चीज़ को कार्यान्वित करते हैं जो कार्यान्वयन-परिभाषित व्यवहार के रूप में सूचीबद्ध है, तो आप अभी भी मानक का पालन करते हैं। इस मामले में C89 जो उद्धृत किया गया था, इस तरह के कार्यान्वयन-परिभाषित व्यवहार को सूचीबद्ध नहीं करता है, इसलिए उद्धरण की आवश्यकता है, यह साबित करने के लिए कि वह केवल चीजों को नीले रंग से बाहर नहीं कर रहा है।
लुंडिन

1
@ लुंडिन आप इसे गलत तरीके से देख रहे हैं। हम जिस चीज के बारे में बात कर रहे हैं वह कार्यान्वयन-परिभाषित व्यवहार नहीं है, हम मानक के विचलन के बारे में बात कर रहे हैं यदि वे ऐसा चुनते हैं। यह उनके माता-पिता की अवज्ञा करने वाले बच्चे की तरह अधिक है: आपको माता-पिता से एक उद्धरण की आवश्यकता नहीं है जो आपको यह बताए कि माता-पिता ने जो कहा उसके खिलाफ बच्चा किस तरीके से जा सकता है। आप बस यह जानते हैं कि बच्चा ऐसा करने का विकल्प चुनता है, वे अब अपने माता-पिता के साथ अनुपालन नहीं कर रहे हैं
KABoissonneault

2
@KABoissonneault मेरी टिप्पणी में उद्धृत हिस्सा निश्चित रूप से कार्यान्वयन-परिभाषित व्यवहार के बारे में है (जैसा कि गैर-मानक संकलक एक्सटेंशन के विपरीत है ।) इस प्रकार मैं कार्यान्वयन-परिभाषित व्यवहार के बारे में बात कर रहा हूं। यदि आप किसी और चीज़ के बारे में एकालाप कर रहे हैं, तो उसके साथ शुभकामनाएँ।
लुंडिन

1
@ लुंडिन मुझे लगता है कि बोली में शब्दांकन भ्रामक है (वह हिस्सा जहां वे कहते हैं "लेकिन यह कार्यक्रम कार्यान्वयन को परिभाषित करता है") लेकिन मुझे पूरा यकीन है कि व्यक्ति गैर-मानक व्यवहार के बारे में बात कर रहा था (जैसा कि "एक कार्यान्वयन में कहा गया है" अनुमति देता है "और" और अब सख्ती से [मानक] "के अनुरूप नहीं है) वास्तविक कार्यान्वयन परिभाषित व्यवहार के विपरीत। व्यक्ति को निश्चित रूप से उनके उत्तर को पुन: प्रस्तुत करना चाहिए, लेकिन मुझे अभी भी नहीं लगता कि मानक से एक उद्धरण उस पर आवश्यक है
KABoissonneault

117

स्टैंडर्ड सी - होस्टेड पर्यावरण

एक होस्ट किए गए वातावरण के लिए (यह सामान्य है), C11 मानक (ISO / IEC 9899: 2011) कहता है:

5.1.2.2.1 प्रोग्राम स्टार्टअप

कार्यक्रम को प्रोग्राम स्टार्टअप कहा जाता है main । कार्यान्वयन इस फ़ंक्शन के लिए कोई प्रोटोटाइप घोषित नहीं करता है। इसे रिटर्न प्रकार के intसाथ और बिना किसी पैरामीटर के साथ परिभाषित किया जाएगा :

int main(void) { /* ... */ }

या दो मापदंडों के साथ (के रूप में यहाँ argcऔर कहा जाता हैargv , हालांकि किसी भी नाम का इस्तेमाल किया जा सकता है, वे समारोह में वे घोषित किये गए हैं करने के लिए स्थानीय कर रहे हैं के रूप में):

int main(int argc, char *argv[]) { /* ... */ }

या उसके बराबर;10) या कुछ अन्य कार्यान्वयन-परिभाषित तरीके से।

यदि उन्हें घोषित किया जाता है, तो मुख्य कार्य के पैरामीटर निम्नलिखित बाधाओं का पालन करेंगे:

  • का मूल्य argc nonnegative होगा।
  • argv[argc] एक अशक्त सूचक होगा।
  • यदि का मान argcशून्य से अधिक है, तो सरणी सदस्य इसके argv[0]माध्यम से argv[argc-1] समावेशी के स्ट्रिंगर्स को पॉइंटर्स होंगे, जिन्हें प्रोग्राम स्टार्टअप से पहले होस्ट वातावरण द्वारा कार्यान्वयन-परिभाषित मान दिए जाते हैं। इरादा मेजबान वातावरण में कहीं और से कार्यक्रम स्टार्टअप से पहले निर्धारित कार्यक्रम की जानकारी की आपूर्ति करने के लिए है। यदि मेजबान वातावरण अपरकेस और लोअरकेस दोनों में अक्षरों के साथ तारों की आपूर्ति करने में सक्षम नहीं है, तो कार्यान्वयन यह सुनिश्चित करेगा कि तार लोअरकेस में प्राप्त होते हैं।
  • यदि मान argcशून्य से अधिक है, तो इसके द्वारा इंगित स्ट्रिंग argv[0] प्रोग्राम के नाम का प्रतिनिधित्व करती है; argv[0][0]यदि प्रोग्राम नाम होस्ट वातावरण से उपलब्ध नहीं है, तो अशक्त वर्ण होगा। यदि का मान argcएक से अधिक है, तार द्वारा की ओर इशारा किया argv[1]के माध्यम से argv[argc-1] कार्यक्रम मापदंडों प्रतिनिधित्व करते हैं।
  • सरणी द्वारा इंगित किए गए पैरामीटर argcऔर argvतार argvप्रोग्राम द्वारा संशोधित किए जाएंगे, और प्रोग्राम स्टार्टअप और प्रोग्राम समाप्ति के बीच अपने अंतिम-संग्रहीत मूल्यों को बनाए रखेंगे।

10) इस प्रकार, के intरूप में परिभाषित एक टाइपडिफ नाम से प्रतिस्थापित किया जा सकता है int, या के argvरूप में लिखा जा सकता है char **argv, और इसी तरह।

C99 या C11 में प्रोग्राम समाप्ति

main()कार्यान्वयन-परिभाषित तरीके से मान लौटाया गया 'पर्यावरण' को प्रेषित किया जाता है।

5.1.2.2.3 कार्यक्रम समाप्ति

1 यदि mainफ़ंक्शन का रिटर्न प्रकार एक प्रकार के साथ संगत है int, तो mainफ़ंक्शन के लिए प्रारंभिक कॉल से वापसी फ़ंक्शन को उसके तर्क के रूप में exitदिए गए मान के साथ फ़ंक्शन को कॉल करने के बराबर है main; 11)} उस तक पहुंचने वाले mainफ़ंक्शन को 0. का मान लौटाता है। यदि रिटर्न प्रकार के साथ संगत नहीं है int, तो मेजबान वातावरण में लौटाए गए समाप्ति की स्थिति अनिर्दिष्ट है।

११) ६.२.४ के अनुसार, main पूर्व में घोषित की गई स्वचालित भंडारण अवधि के साथ वस्तुओं का जीवनकाल पूर्व में समाप्त हो जाएगा, यहां तक ​​कि जहां वे बाद में नहीं होंगे।

ध्यान दें कि 0'सफलता' के रूप में अनिवार्य है। आप उपयोग कर सकते हैं EXIT_FAILUREऔर EXIT_SUCCESSसे <stdlib.h>यदि आप पसंद करते हैं, लेकिन 0 अच्छी तरह से स्थापित है, और इसलिए 1. यह भी देखें है से बाहर निकलें कोड 255 से अधिक से अधिक - संभव?

C89 में (और इसलिए Microsoft C में), main()फ़ंक्शन के वापस आने पर क्या होता है, इसके बारे में कोई बयान नहीं है लेकिन रिटर्न मान निर्दिष्ट नहीं करता है; इसलिए यह अपरिभाषित व्यवहार की ओर जाता है।

7.22.4.4 exitफ़ंक्शन

¶5 अंत में, मेजबान वातावरण पर नियंत्रण वापस आ गया है। यदि का मान statusशून्य है या EXIT_SUCCESS, स्थिति के सफल समापन का कार्यान्वयन-परिभाषित रूप वापस आ गया है। यदि मान statusहै EXIT_FAILURE, तो असफल समाप्ति की स्थिति का कार्यान्वयन-परिभाषित रूप वापस आ जाता है। अन्यथा दी गई स्थिति कार्यान्वयन-परिभाषित है।

स्टैंडर्ड सी ++ - होस्टेड पर्यावरण

C ++ 11 मानक (ISO / IEC 14882: 2011) कहता है:

3.6.1 मुख्य कार्य [basic.start.main]

¶1 एक कार्यक्रम में मुख्य नामक एक वैश्विक कार्य शामिल होगा, जो कार्यक्रम की निर्धारित शुरुआत है। [...]

¶2 एक कार्यान्वयन मुख्य कार्य को पूर्वनिर्धारित नहीं करेगा। यह फ़ंक्शन अतिभारित नहीं किया जाएगा। इसमें एक वापसी प्रकार का इंट इंट होगा, लेकिन अन्यथा इसका प्रकार कार्यान्वयन परिभाषित है। सभी कार्यान्वयन मुख्य की निम्नलिखित परिभाषाओं की अनुमति देंगे:

int main() { /* ... */ }

तथा

int main(int argc, char* argv[]) { /* ... */ }

उत्तरार्द्ध में argcउस प्रोग्राम के लिए पारित किए गए तर्कों की संख्या होगी जिसमें पर्यावरण चलाया जाता है। यदि argcनॉनज़ेरो है, तो इन तर्कों को बिंदुओं के argv[0] माध्यम argv[argc-1]से अशक्त-बहुल मल्टीबाइट स्ट्रिंग्स (NTMBSs) (17.5.2.1.4.2) के प्रारंभिक वर्णों के माध्यम से आपूर्ति की argv[0]जाएगी और NTMBS के प्रारंभिक चरित्र के सूचक होंगे जो नाम के लिए उपयोग किया जाता है कार्यक्रम को आमंत्रित करें या ""। का मान argcगैर-ऋणात्मक होगा। का मान argv[argc] 0. होगा [नोट: यह अनुशंसा की जाती है कि आगे (वैकल्पिक) मापदंडों को जोड़ा जाए argv। ध्यान दें]

¶3 फ़ंक्शन का mainउपयोग किसी प्रोग्राम के भीतर नहीं किया जाएगा। mainकार्यान्वयन (परिभाषित ) का लिंकेज (3.5) है। [...]

¶5 मुख्य में एक रिटर्न स्टेटमेंट में मुख्य फ़ंक्शन को छोड़ने (स्वचालित भंडारण अवधि के साथ किसी भी ऑब्जेक्ट को नष्ट करना) और std::exitतर्क के रूप में रिटर्न वैल्यू के साथ कॉल करने का प्रभाव होता है। यदि नियंत्रण रिटर्न स्टेटमेंट का सामना किए बिना मुख्य के अंत तक पहुंचता है, तो प्रभाव निष्पादन का है

return 0;

C ++ मानक स्पष्ट रूप से कहता है "यह [मुख्य कार्य] प्रकार का वापसी प्रकार होगा int, लेकिन अन्यथा इसका प्रकार कार्यान्वयन परिभाषित है", और विकल्प के रूप में समर्थित होने के लिए C मानक के समान दो हस्ताक्षर की आवश्यकता होती है। इसलिए 'void main ()' को C ++ मानक द्वारा सीधे अनुमति नहीं दी जाती है, हालांकि यह विकल्प को अनुमति देने वाले गैर-मानक कार्यान्वयन को रोकने के लिए कुछ भी नहीं कर सकता है। ध्यान दें कि C ++ उपयोगकर्ता को कॉल करने से मना करता है main(लेकिन C मानक नहीं करता है)।

वहाँ §18.5 का एक पैरा है प्रारंभ और समाप्ति सी 11 मानक में ++ कि §7.22.4.4 से पैरा के समान है समारोह C11 मानक में (ऊपर उद्धृत), के अलावा एक फुटनोट से (जो केवल दस्तावेज़ों को और परिभाषित कर रहे हैं में )।exitEXIT_SUCCESSEXIT_FAILURE<cstdlib>

मानक सी - सामान्य विस्तार

शास्त्रीय रूप से, यूनिक्स सिस्टम एक तीसरे संस्करण का समर्थन करते हैं:

int main(int argc, char **argv, char **envp) { ... }

तीसरा तर्क स्ट्रिंगर्स को इंगित करने वालों की एक शून्य-समाप्त सूची है, जिनमें से प्रत्येक एक पर्यावरण चर है जिसका एक नाम, एक बराबर चिह्न और एक मान है (संभवतः खाली)। यदि आप इसका उपयोग नहीं करते हैं, तो आप अभी भी ' extern char **environ;' के माध्यम से पर्यावरण पर पहुंच सकते हैं । यह वैश्विक वैरिएबल POSIX में उन लोगों के बीच अद्वितीय है, जिनमें इसका शीर्षक नहीं है जो इसे घोषित करता है।

यह C मानक द्वारा एक सामान्य विस्तार के रूप में मान्यता प्राप्त है, अनुबंध J में प्रलेखित है:

J.5.1 पर्यावरण संबंधी तर्क

¶1 एक होस्ट किए गए वातावरण में, मुख्य फ़ंक्शन एक तीसरा तर्क प्राप्त करता है char *envp[], जो कि बिंदुओं के एक शून्य-समाप्त सरणी को charइंगित करता है, जिनमें से प्रत्येक एक स्ट्रिंग को इंगित करता है जो प्रोग्राम के इस निष्पादन के लिए पर्यावरण के बारे में जानकारी प्रदान करता है (5.1। 2.2.1)।

माइक्रोसॉफ्ट सी

माइक्रोसॉफ्ट VS 2010 संकलक दिलचस्प है। वेब साइट का कहना है:

मुख्य के लिए घोषणा सिंटैक्स है

 int main();

या, वैकल्पिक रूप से,

int main(int argc, char *argv[], char *envp[]);

वैकल्पिक रूप से, mainऔर wmainफ़ंक्शंस को रिटर्निंग void(नो रिटर्न मान) के रूप में घोषित किया जा सकता है । यदि आप घोषणा करते हैं mainया wmainशून्य रिटर्न करते हैं, तो आप रिटर्न स्टेटमेंट का उपयोग करके मूल प्रक्रिया या ऑपरेटिंग सिस्टम पर एक निकास कोड नहीं लौटा सकते। जब mainया के wmainरूप में घोषित किया जाता है void, तो एक निकास कोड वापस करने के लिए , आपको exitफ़ंक्शन का उपयोग करना होगा ।

मेरे लिए यह स्पष्ट नहीं है कि क्या होता है (माता-पिता या ओएस के लिए कौन सा निकास कोड लौटाया जाता है) जब कोई कार्यक्रम void main()बाहर निकलता है - और एमएस वेब साइट भी चुप है।

दिलचस्प बात यह है कि एमएस दो-तर्क संस्करण को नहीं बताता है main()कि सी और सी ++ मानकों की आवश्यकता होती है। यह केवल तीन तर्क फ़ॉर्म को निर्धारित करता है char **envp, जहां तीसरा तर्क पर्यावरण चर की सूची के लिए एक संकेतक है।

Microsoft पेज कुछ अन्य विकल्पों को भी सूचीबद्ध करता है - wmain()जो विस्तृत वर्ण स्ट्रिंग्स लेता है, और कुछ और।

इस पृष्ठ का Microsoft Visual Studio 2005 संस्करण विकल्प के रूप में सूचीबद्ध नहीं है । संस्करणों Microsoft से विजुअल स्टूडियो 2008 के बाद से करते हैं।void main()

स्टैंडर्ड सी - फ्रीस्टैंडिंग पर्यावरण

जैसा कि पहले उल्लेख किया गया है, ऊपर की आवश्यकताएं होस्ट किए गए वातावरणों पर लागू होती हैं। यदि आप एक फ्रीस्टैंडिंग वातावरण (जो एक होस्ट किए गए वातावरण का विकल्प है) के साथ काम कर रहे हैं, तो मानक कहने के लिए बहुत कम है। एक फ्रीस्टैंडिंग वातावरण के लिए, प्रोग्राम स्टार्टअप पर कॉल किए जाने वाले फ़ंक्शन को कॉल करने की आवश्यकता नहीं है mainऔर इसके वापसी प्रकार पर कोई बाधा नहीं है। मानक कहता है:

5.1.2 निष्पादन वातावरण

दो निष्पादन वातावरण परिभाषित किए गए हैं: फ्रीस्टैंडिंग और होस्ट। दोनों मामलों में, प्रोग्राम स्टार्टअप तब होता है जब किसी निर्दिष्ट C फ़ंक्शन को निष्पादन परिवेश द्वारा कॉल किया जाता है। प्रोग्राम स्‍टार्टअप से पहले स्थिर संग्रहण अवधि वाली सभी वस्तुओं को प्रारंभिक (उनके प्रारंभिक मानों पर सेट) किया जाएगा। इस तरह के इनिशियलाइज़ेशन का तरीका और समय अन्यथा अनिर्दिष्ट है। कार्यक्रम समाप्ति, निष्पादन पर्यावरण पर नियंत्रण लौटाता है।

5.1.2.1 मुक्त वातावरण

एक फ्रीस्टैंडिंग वातावरण में (जिसमें सी प्रोग्राम का निष्पादन ऑपरेटिंग सिस्टम के किसी भी लाभ के बिना हो सकता है), प्रोग्राम स्टार्टअप पर नाम और प्रकार के फ़ंक्शन कार्यान्वयन-परिभाषित हैं। फ्रीस्टैंडिंग प्रोग्राम के लिए उपलब्ध कोई भी लाइब्रेरी सुविधाएं, जो क्लॉज 4 द्वारा आवश्यक न्यूनतम सेट के अलावा, कार्यान्वयन-परिभाषित हैं।

एक फ्रीस्टैंडिंग वातावरण में कार्यक्रम समाप्ति का प्रभाव कार्यान्वयन-परिभाषित है।

खंड 4 के अनुरूप संदर्भ का संदर्भ इस पर है:

¶5 एक सख्ती से अनुरूप कार्यक्रम इस अंतर्राष्ट्रीय मानक में निर्दिष्ट भाषा और पुस्तकालय की केवल उन विशेषताओं का उपयोग करेगा। 3) यह किसी अनिर्दिष्ट, अपरिभाषित या कार्यान्वयन-परिभाषित व्यवहार पर निर्भर उत्पादन का उत्पादन नहीं करेगा, और किसी भी न्यूनतम कार्यान्वयन सीमा से अधिक नहीं होगा।

¶6 अनुरूप कार्यान्वयन के दो रूप हैं मेजबान और फ्रीस्टैंडिंग । एक अनुरूपित मेजबान कार्यान्वयन किसी भी सख्ती से अनुरूप कार्यक्रम को स्वीकार करेगा। एक अनुरूप फ्रीस्टैंडिंग कार्यान्वयन किसी भी सख्ती से अनुरूप कार्यक्रम में पुस्तकालय क्लॉज (क्लॉज 7) में निर्दिष्ट सुविधाओं के उपयोग के मानक हेडर की सामग्री तक ही सीमित है स्वीकार करेगा <float.h>, <iso646.h>, <limits.h>, <stdalign.h>, <stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h>, और <stdnoreturn.h>। एक अनुरूप कार्यान्वयन में एक्सटेंशन (अतिरिक्त लाइब्रेरी फ़ंक्शंस सहित) हो सकते हैं, बशर्ते वे किसी भी सख्ती से अनुरूप कार्यक्रम के व्यवहार में परिवर्तन न करें। 4)

¶7 एक अनुरूप कार्यक्रम वह है जो एक अनुरूप कार्यान्वयन के लिए स्वीकार्य है। 5)

3) एक सख्ती से अनुरूप कार्यक्रम सशर्त सुविधाओं का उपयोग कर सकता है (6.10.8.3 देखें) बशर्ते उपयोग संबंधित मैक्रो का उपयोग करके एक उपयुक्त सशर्त समावेशन प्रीप्रोसेसिंग निर्देश द्वारा संरक्षित है। उदाहरण के लिए:

#ifdef __STDC_IEC_559__ /* FE_UPWARD defined */
    /* ... */
    fesetround(FE_UPWARD);
    /* ... */
#endif

4) इसका तात्पर्य यह है कि एक अनुरूप कार्यान्वयन इस अंतर्राष्ट्रीय मानक में स्पष्ट रूप से आरक्षित लोगों के अलावा कोई पहचानकर्ता नहीं रखता है।

5) कड़ाई से अनुरूपण कार्यक्रमों के अनुरूप कार्यान्वयन के बीच अधिकतम पोर्टेबल होने का इरादा है। अनुरूपण कार्यान्वयन के गैर-पोर्टेबल सुविधाओं पर निर्भर कार्यक्रम हो सकते हैं।

यह ध्यान देने योग्य है कि फ्रीस्टैंडिंग वातावरण के लिए आवश्यक एकमात्र हेडर जो वास्तव में किसी भी फ़ंक्शन को परिभाषित करता है <stdarg.h>(और यहां तक ​​कि वे भी हो सकते हैं - और अक्सर होते हैं - बस मैक्रोज़)।

स्टैंडर्ड सी ++ - फ्रीस्टैंडिंग पर्यावरण

जिस तरह C मानक होस्ट और फ्रीस्टैंडिंग दोनों वातावरण को पहचानता है, उसी प्रकार C ++ मानक भी। (आईएसओ / आईईसी 14882 से उद्धरण: 2011)

1.4 कार्यान्वयन अनुपालन [intro.compliance]

¶7 दो प्रकार के कार्यान्वयन परिभाषित किए गए हैं: ए होस्ट किया गया कार्यान्वयन और एक फ्रीस्टैंडिंग कार्यान्वयन । एक होस्ट किए गए कार्यान्वयन के लिए, यह अंतर्राष्ट्रीय मानक उपलब्ध पुस्तकालयों के सेट को परिभाषित करता है। एक फ्रीस्टैंडिंग कार्यान्वयन वह है जिसमें निष्पादन एक ऑपरेटिंग सिस्टम के लाभ के बिना हो सकता है, और इसमें पुस्तकालयों का कार्यान्वयन-परिभाषित सेट होता है जिसमें कुछ भाषा-समर्थन पुस्तकालय (17.6.1.3) शामिल होते हैं।

¶8 एक अनुरूप कार्यान्वयन में एक्सटेंशन (अतिरिक्त लाइब्रेरी फ़ंक्शंस सहित) हो सकते हैं, बशर्ते वे किसी भी सुव्यवस्थित कार्यक्रम के व्यवहार में परिवर्तन न करें। कार्यान्वयन ऐसे कार्यक्रमों का निदान करने के लिए आवश्यक हैं जो ऐसे विस्तार का उपयोग करते हैं जो इस अंतर्राष्ट्रीय मानक के अनुसार बीमार हैं। हालांकि, ऐसा करने के बाद, वे ऐसे कार्यक्रमों को संकलित और निष्पादित कर सकते हैं।

Ally9 प्रत्येक कार्यान्वयन में प्रलेखन शामिल होगा जो सभी सशर्त रूप से समर्थित निर्माणों की पहचान करता है जो इसका समर्थन नहीं करता है और सभी स्थानीय-विशिष्ट विशेषताओं को परिभाषित करता है।3

3) यह प्रलेखन कार्यान्वयन-परिभाषित व्यवहार को भी परिभाषित करता है; देखें 1.9।

17.6.1.3 फ्रीस्टैंडिंग कार्यान्वयन [अनुपालन]

दो प्रकार के कार्यान्वयन परिभाषित हैं: होस्टेड और फ्रीस्टैंडिंग (1.4)। एक होस्ट किए गए कार्यान्वयन के लिए, यह अंतर्राष्ट्रीय मानक उपलब्ध हेडर के सेट का वर्णन करता है।

एक फ्रीस्टैंडिंग कार्यान्वयन में हेडर्स का कार्यान्वयन-परिभाषित सेट है। इस सेट में तालिका 16 में दिखाए गए कम से कम हेडर शामिल होंगे।

हेडर के आपूर्ति की संस्करण <cstdlib>घोषणा करेगी कम से कम काम करता है abort, atexit, at_quick_exit, exit, औरquick_exit (18.5)। इस तालिका में सूचीबद्ध अन्य शीर्षलेखों को एक होस्ट किए गए कार्यान्वयन के लिए समान आवश्यकताओं को पूरा करना होगा।

तालिका 16 - फ्रीस्टैंडिंग कार्यान्वयन के लिए सी ++ हेडर

Subclause                           Header(s)
                                    <ciso646>
18.2  Types                         <cstddef>
18.3  Implementation properties     <cfloat> <limits> <climits>
18.4  Integer types                 <cstdint>
18.5  Start and termination         <cstdlib>
18.6  Dynamic memory management     <new>
18.7  Type identification           <typeinfo>
18.8  Exception handling            <exception>
18.9  Initializer lists             <initializer_list>
18.10 Other runtime support         <cstdalign> <cstdarg> <cstdbool>
20.9  Type traits                   <type_traits>
29    Atomics                       <atomic>

int main()सी में उपयोग करने के बारे में क्या ?

C11 मानक का मानक standard5.1.2.2.1 पसंदीदा अंकन दिखाता है -  int main(void)- लेकिन मानक में दो उदाहरण भी हैं जो दिखाते हैं int main(): which6.5.3.4 ¶8 और §6.7.6.3 .20 । अब, यह ध्यान रखना महत्वपूर्ण है कि उदाहरण 'आदर्शवादी' नहीं हैं; वे केवल दृष्टांत हैं। यदि उदाहरणों में बग हैं, तो वे सीधे मानक के मुख्य पाठ को प्रभावित नहीं करते हैं। उन्होंने कहा, वे दृढ़ता से अपेक्षित व्यवहार के सूचक हैं, इसलिए यदि मानक int main()एक उदाहरण में शामिल है, तो यह सुझाव देता है कि int main()निषिद्ध नहीं है, भले ही यह पसंदीदा संकेतन न हो।

6.5.3.4 ऑपरेटरों sizeofऔर _Alignofऑपरेटरों

...

¶8 उदाहरण 3 इस उदाहरण में, एक चर लंबाई सरणी के आकार की गणना की गई है और एक फ़ंक्शन से लौटाया गया है:

#include <stddef.h>

size_t fsize3(int n)
{
    char b[n+3]; // variable length array
    return sizeof b; // execution time sizeof
}
int main()
{
    size_t size;
    size = fsize3(10); // fsize3 returns 13
    return 0;
}

@DavidBowling: फ़ंक्शन फ़ंक्शन जैसी परिभाषा int main(){ … }निर्दिष्ट करती है कि फ़ंक्शन कोई तर्क नहीं लेता है, लेकिन फ़ंक्शन प्रोटोटाइप, AFAICT प्रदान नहीं करता है। उसके लिए main()शायद ही कभी कोई समस्या हो; इसका अर्थ है कि यदि आपके पास पुनरावर्ती कॉल हैं main(), तो तर्कों की जाँच नहीं की जाएगी। अन्य कार्यों के लिए, यह एक समस्या है - आपको वास्तव में दायरे में एक प्रोटोटाइप की आवश्यकता होती है जब फ़ंक्शन यह सुनिश्चित करने के लिए कहा जाता है कि तर्क सही हैं।
जोनाथन लेफ़लर

1
@ डेविडबाउलिंग: आप सामान्य रूप से main()IOCCC जैसी जगहों के बाहर, पुनरावर्ती कॉल नहीं करते हैं। मेरे पास एक परीक्षण कार्यक्रम है जो इसे करता है - मुख्य रूप से नवीनता के लिए। यदि आपके पास int i = 0; int main() { if (i++ < 10) main(i, i * i); return 0; }GCC है और शामिल नहीं है -Wstrict-prototypes, तो यह कड़े चेतावनियों के तहत साफ-साफ संकलन करता है। यदि यह है main(void), तो यह संकलन करने में विफल रहता है।
जोनाथन लेफलर

61

मेरा मानना ​​है कि या main()तो लौट जाना चाहिए । वे में परिभाषित हैंEXIT_SUCCESSEXIT_FAILUREstdlib.h


20
0 भी मानक है।
क्रिस यंग

2
@ChrisYoung है EXIT_SUCCESSऔर EXIT_FAILUREक्योंकि कुछ ऐतिहासिक ऑपरेटिंग सिस्टम (VMS?) ने सफलता को दर्शाने के लिए 0 से भिन्न संख्या का उपयोग किया है। यह आजकल हर जगह 0 है।
fuz

5
@FUZxxl आप सही हैं, लेकिन यह मेरी टिप्पणी के साथ विरोध में नहीं है। EXIT_SUCCESS वास्तव में नॉनजरो हो सकता है, लेकिन मानकों (C89, C99, C11) सभी को परिभाषित करते हैं 0 (साथ ही EXIT_SUCCESS) भी स्थिति के सफल समापन के कार्यान्वयन-परिभाषित रूप हो सकते हैं।
क्रिस यंग

2
@FUZxxl: यह सच है कि वीएमएस ने सफलता को इंगित करने के लिए विषम मानों (जैसे 1) का उपयोग किया और असफलता का संकेत देने के लिए भी मान (जैसे 0)। दुर्भाग्य से, मूल ANSI C मानक का अर्थ यह था कि EXIT_SUCCESS को 0 होना था, इसलिए मुख्य से EXIT_SUCCESS को वापस करना VMS पर बिलकुल गलत व्यवहार था। वीएमएस के लिए पोर्टेबल चीज़ का उपयोग करना था exit(EXIT_SUCCESS), जिसने हमेशा सही काम किया।
एड्रियन मैक्कार्थी

1
5.1.2.2.3 "यदि मुख्य फ़ंक्शन का रिटर्न प्रकार इंट के साथ संगत प्रकार है, तो प्रारंभिक कॉल से मुख्य फ़ंक्शन के लिए रिटर्न एग्ज़िट फ़ंक्शन को मुख्य फ़ंक्शन द्वारा लौटाए गए मान के साथ कॉल करने के बराबर है; 11)} तक पहुँचना जो मुख्य फ़ंक्शन को समाप्त करता है 0. का मान लौटाता है।
लंडिन

38

ध्यान दें कि C और C ++ मानक दो प्रकार के कार्यान्वयन को परिभाषित करते हैं: फ्रीस्टैंडिंग और होस्ट।

  • C90 होस्टेड वातावरण

    अनुमत प्रपत्र 1 :

    int main (void)
    int main (int argc, char *argv[])
    
    main (void)
    main (int argc, char *argv[])
    /*... etc, similar forms with implicit int */

    टिप्पणियाँ:

    पूर्व दो को स्पष्ट रूप से अनुमत रूपों के रूप में कहा गया है, अन्य को स्पष्ट रूप से अनुमति दी गई है क्योंकि C90 ने वापसी प्रकार और फ़ंक्शन मापदंडों के लिए "निहित int" की अनुमति दी है। किसी अन्य रूप की अनुमति नहीं है।

  • C90 पर्यावरण मुक्त

    मुख्य के किसी भी रूप या नाम की अनुमति है 2

  • C99 पर्यावरण की मेजबानी की

    अनुमत प्रपत्र 3 :

    int main (void)
    int main (int argc, char *argv[])
    /* or in some other implementation-defined manner. */

    टिप्पणियाँ:

    C99 ने "अंतर्निहित int" को हटा दिया, इसलिए main()अब मान्य नहीं है।

    एक अजीब, अस्पष्ट वाक्य "या कुछ अन्य कार्यान्वयन-परिभाषित तरीके से" पेश किया गया है। इसे या तो "पैरामीटर int main()भिन्न हो सकते हैं" के रूप में व्याख्या की जा सकती है या "मुख्य का कोई कार्यान्वयन-परिभाषित रूप हो सकता है"।

    कुछ कंपाइलरों ने बाद के तरीके में मानक की व्याख्या करने के लिए चुना है। यकीनन, कोई भी आसानी से यह नहीं कह सकता है कि वे अपने आप में मानक का हवाला देते हुए कड़ाई से अनुरूप नहीं हैं, क्योंकि यह अस्पष्ट है।

    हालांकि, पूरी तरह से जंगली रूपों की अनुमति देने के लिए main()शायद (?) इस नए वाक्य का इरादा नहीं था। C99 औचित्य (आदर्श नहीं) का अर्थ है कि वाक्य 4 को अतिरिक्त मापदंडों को संदर्भित करता हैint main

    फिर भी होस्टेड पर्यावरण कार्यक्रम समाप्ति के लिए अनुभाग उस मामले के बारे में बहस करता है जहां मुख्य इंट 5 नहीं लौटता है । यद्यपि यह खंड इस बात के लिए मानक नहीं है कि मुख्य को कैसे घोषित किया जाना चाहिए, यह निश्चित रूप से इसका अर्थ है कि मुख्य रूप से होस्ट किए गए सिस्टम पर भी पूरी तरह से कार्यान्वयन-परिभाषित तरीके से घोषित किया जा सकता है।

  • C99 पर्यावरण मुक्त

    मुख्य के किसी भी रूप या नाम की अनुमति है 6

  • C11 पर्यावरण की मेजबानी की

    स्वीकृत प्रपत्र 7 :

    int main (void)
    int main (int argc, char *argv[])
    /* or in some other implementation-defined manner. */
  • C11 पर्यावरण मुक्त

    मुख्य के किसी भी रूप या नाम की अनुमति है 8


ध्यान दें कि int main()उपरोक्त संस्करणों में सी के किसी भी होस्ट किए गए कार्यान्वयन के लिए एक वैध रूप के रूप में सूचीबद्ध नहीं किया गया था। C में, C ++ के विपरीत, ()और (void)अलग-अलग अर्थ हैं। पूर्व एक अश्लील विशेषता है जिसे भाषा से हटाया जा सकता है। C11 भविष्य की भाषा निर्देश देखें:

6.11.6 समारोह घोषणाकर्ता

खाली कोष्ठकों के साथ फ़ंक्शन घोषणाओं का उपयोग (प्रोटोटाइप-प्रारूप पैरामीटर प्रकार घोषणाकर्ता नहीं) एक अप्रचलित विशेषता है।


  • C ++ 03 होस्ट किया गया वातावरण

    स्वीकृत प्रपत्र 9 :

    int main ()
    int main (int argc, char *argv[])

    टिप्पणियाँ:

    पहले रूप में खाली कोष्ठक पर ध्यान दें। C ++ और C इस मामले में भिन्न हैं, क्योंकि C ++ में इसका मतलब है कि फ़ंक्शन कोई पैरामीटर नहीं लेता है। लेकिन सी में इसका मतलब है कि यह कोई भी पैरामीटर ले सकता है।

  • C ++ 03 फ्रीस्टैंडिंग वातावरण

    स्टार्टअप में कहे जाने वाले फ़ंक्शन का नाम कार्यान्वयन-परिभाषित है। यदि इसे नाम दिया गया है तो main()इसे बताए गए रूपों का पालन करना चाहिए 10 :

    // implementation-defined name, or 
    int main ()
    int main (int argc, char *argv[])
  • C ++ 11 होस्ट किया गया वातावरण

    स्वीकृत प्रपत्र 11 :

    int main ()
    int main (int argc, char *argv[])

    टिप्पणियाँ:

    मानक का पाठ बदल दिया गया है लेकिन इसका एक ही अर्थ है।

  • सी ++ 11 फ्रीस्टैंडिंग वातावरण

    स्टार्टअप में कहे जाने वाले फ़ंक्शन का नाम कार्यान्वयन-परिभाषित है। यदि इसे नाम दिया गया है तो main()इसे बताए गए रूपों का पालन करना चाहिए 12 :

    // implementation-defined name, or 
    int main ()
    int main (int argc, char *argv[])

संदर्भ

  1. ANSI X3.159-1989 2.1.2.2 होस्ट किया गया वातावरण। "प्रोग्राम स्टार्टअप"

    कार्यक्रम स्टार्टअप पर बुलाया समारोह का नाम मुख्य है। कार्यान्वयन इस फ़ंक्शन के लिए कोई प्रोटोटाइप घोषित नहीं करता है। इसे रिटर्न प्रकार के int के साथ परिभाषित किया जाएगा और बिना किसी पैरामीटर के:

    int main(void) { /* ... */ } 

    या दो मापदंडों के साथ (यहां बताया गया है कि argc और argv के रूप में, हालांकि किसी भी नाम का उपयोग किया जा सकता है, क्योंकि वे उस समारोह में स्थानीय होते हैं जिसमें उन्हें घोषित किया जाता है):

    int main(int argc, char *argv[]) { /* ... */ }
  2. ANSI X3.159-1989 2.1.2.1 फ्रीस्टैंडिंग वातावरण:

    एक फ्रीस्टैंडिंग वातावरण में (जिसमें सी प्रोग्राम का निष्पादन ऑपरेटिंग सिस्टम के किसी भी लाभ के बिना हो सकता है), प्रोग्राम स्टार्टअप पर नाम और प्रकार के फ़ंक्शन कार्यान्वयन-परिभाषित हैं।

  3. आईएसओ 9899: 1999 5.1.2.2 होस्टेड वातावरण -> 5.1.2.2.1 प्रोग्राम स्टार्टअप

    कार्यक्रम स्टार्टअप पर बुलाया समारोह का नाम मुख्य है। कार्यान्वयन इस फ़ंक्शन के लिए कोई प्रोटोटाइप घोषित नहीं करता है। इसे रिटर्न प्रकार के int के साथ परिभाषित किया जाएगा और बिना किसी पैरामीटर के:

    int main(void) { /* ... */ } 

    या दो मापदंडों के साथ (यहां बताया गया है कि argc और argv के रूप में, हालांकि किसी भी नाम का उपयोग किया जा सकता है, क्योंकि वे उस समारोह में स्थानीय होते हैं जिसमें उन्हें घोषित किया जाता है):

    int main(int argc, char *argv[]) { /* ... */ }

    या समकक्ष; 9) या कुछ अन्य कार्यान्वयन-परिभाषित तरीके से।

  4. अंतर्राष्ट्रीय मानक के लिए तर्क - प्रोग्रामिंग भाषाएँ - सी, संशोधन 5.10। 5.1.2.2 होस्ट किया गया वातावरण -> 5.1.2.2.1 प्रोग्राम स्टार्टअप

    तर्कों का व्यवहार मुख्य, और निकास की बातचीत, मुख्य और एटैक्सिट (the7.20.4.2 देखें) को argv स्ट्रिंग्स के प्रतिनिधित्व में कुछ अवांछित विविधता पर अंकुश लगाने के लिए और मुख्य के रूप में लौटाए गए मूल्यों के अर्थ में संहिताबद्ध किया गया है।

    मुख्य तर्क के रूप में argc और argv के विनिर्देश व्यापक पूर्व अभ्यास को मान्यता देते हैं। argv [argc] को सूची के अंत के लिए एक निरर्थक जांच प्रदान करने के लिए एक शून्य सूचक होने की आवश्यकता है, वह भी सामान्य अभ्यास के आधार पर।

    मुख्य एकमात्र ऐसा कार्य है जिसे शून्य या दो तर्कों के साथ आंशिक रूप से घोषित किया जा सकता है। (अन्य कार्यों के तर्कों की संख्या को आह्वान और परिभाषा के बीच बिल्कुल मेल खाना चाहिए।) यह विशेष मामला केवल तर्कों को मुख्य रूप से छोड़ने की व्यापक प्रथा को मान्यता देता है जब प्रोग्राम प्रोग्राम तर्क तार तक नहीं पहुंचता है। जबकि कई कार्यान्वयन मुख्य से दो तर्कों का समर्थन करते हैं, इस तरह का अभ्यास न तो धन्य है और न ही मानक द्वारा निषिद्ध है; एक कार्यक्रम जो तीन तर्कों के साथ मुख्य परिभाषित करता है, सख्ती से अनुरूप नहीं है (देखें .1J.5.1।)।

  5. आईएसओ 9899: 1999 5.1.2.2 होस्टेड वातावरण -> 5.1.2.2.3 कार्यक्रम समाप्ति

    यदि मुख्य फ़ंक्शन का रिटर्न प्रकार इंट के साथ संगत प्रकार है, तो मुख्य फ़ंक्शन के लिए प्रारंभिक कॉल से एक वापसी इसके फ़ंक्शन के रूप में मुख्य फ़ंक्शन द्वारा लौटाए गए मान के साथ निकास फ़ंक्शन को कॉल करने के बराबर है; 11) }उस टर्मिनस तक पहुंचती है; मुख्य फ़ंक्शन 0. का मान लौटाता है। यदि रिटर्न प्रकार इंट के साथ संगत नहीं है, तो होस्ट वातावरण में वापस लौटी समाप्ति की स्थिति अनिर्दिष्ट है।

  6. आईएसओ 9899: 1999 5.1.2.1 फ्रीस्टैंडिंग वातावरण

    एक फ्रीस्टैंडिंग वातावरण में (जिसमें सी प्रोग्राम का निष्पादन ऑपरेटिंग सिस्टम के किसी भी लाभ के बिना हो सकता है), प्रोग्राम स्टार्टअप पर नाम और प्रकार के फ़ंक्शन कार्यान्वयन-परिभाषित हैं।

  7. आईएसओ 9899: 2011 5.1.2.2 होस्टेड वातावरण -> 5.1.2.2.1 कार्यक्रम स्टार्टअप

    यह खंड ऊपर उद्धृत C99 के समान है।

  8. आईएसओ 9899: 1999 5.1.2.1 फ्रीस्टैंडिंग वातावरण

    यह खंड ऊपर उद्धृत C99 के समान है।

  9. आईएसओ 14882: 2003 3.6.1 मुख्य समारोह

    एक कार्यान्वयन मुख्य कार्य को पूर्वनिर्धारित नहीं करेगा। यह फ़ंक्शन अतिभारित नहीं किया जाएगा। इसमें वापसी प्रकार का इंट इंट होगा, लेकिन अन्यथा इसका प्रकार कार्यान्वयन-परिभाषित है। सभी कार्यान्वयन मुख्य की निम्नलिखित परिभाषाओं की अनुमति देंगे:

    int main() { /* ... */ }

    तथा

    int main(int argc, char* argv[]) { /* ... */ }
  10. आईएसओ 14882: 2003 3.6.1 मुख्य समारोह

    यह कार्यान्वयन-परिभाषित है कि मुख्य कार्य को परिभाषित करने के लिए एक फ्रीस्टैंडिंग वातावरण में एक कार्यक्रम की आवश्यकता है या नहीं।

  11. आईएसओ 14882: 2011 3.6.1 मुख्य समारोह

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

    - () लौटने का एक समारोह int और

    - इंट का एक फ़ंक्शन (इंट, पॉइंटर टू पॉइंटर टू चार) इंटिंग रिटर्न

    मुख्य के प्रकार के रूप में (8.3.5)।

  12. आईएसओ 14882: 2011 3.6.1 मुख्य समारोह

    यह खंड ऊपर उद्धृत C ++ 03 के समान है।


एक प्रश्न: क्या C ++ मानकों का मतलब है कि फ्रीस्टैंडिंग वातावरण में स्टार्टअप फ़ंक्शन के हस्ताक्षर को लागू किया गया है? उदाहरण के लिए, एक कार्यान्वयन स्टार्टअप फ़ंक्शन को परिभाषित कर सकता है: int my_startup_function ()या int my_startup_function (int argc, char *argv[])यह हो सकता है, उदाहरण के लिए: char my_startup_function (long argc, int *argv[])स्टार्टअप फ़ंक्शन के रूप में भी? मुझे लगता है कि नहीं, है ना? इसके अलावा, वह अस्पष्ट भी नहीं है?
उत्कर्ष

@ यूटकु यह कोई भी हस्ताक्षर हो सकता है, जब तक इसका नाम नहीं है main()क्योंकि तब इसे एक सूचीबद्ध हस्ताक्षर का उपयोग करना होगा। मुझे लगता है कि यह सबसे आम एक होगा void my_startup_function (), क्योंकि यह फ्रीस्टैंडिंग सिस्टम पर कार्यक्रम से लौटने का कोई मतलब नहीं है।
लुंडिन

1
समझा। लेकिन अगर इसे स्टार्टअप फ़ंक्शन के लिए किसी भी नाम और किसी भी हस्ताक्षर का उपयोग करने की अनुमति है, तो एक अलग हस्ताक्षर का उपयोग करने की अनुमति क्यों नहीं है main? खेद है कि अगर यह एक स्मार्ट सवाल नहीं है, लेकिन मैं तर्क के पीछे समझ नहीं सका।
उत्कर्ष

@Utku सी और सी ++ वहाँ अलग हैं। जैसे ही C ++ इस बात को लागू करता है, मेरे पास कोई विचार नहीं है, कोई तर्क नहीं है। मुझे लगता है कि मुख्य अपराधी (सज़ा का इरादा) स्ट्रॉस्ट्रुप है, जिसने घोषित किया कि मुख्य को इंट, पीरियड वापस करना होगा। क्योंकि जब उन्होंने पहला C ++ संस्करण बनाया था, तो उनका उपयोग केवल होस्टेड सिस्टम के लिए किया गया था। लिंक किए गए पोस्ट में, स्ट्रॉस्ट्रुप अभी भी फ्रीस्टैंडिंग कार्यान्वयन के अस्तित्व के बारे में अनजान है: उदाहरण के लिए, वह अनजाने में सी मानक के होस्ट किए गए कार्यान्वयन उप अध्याय का उल्लेख कर रहा है, अध्याय 5.1.2.1 के अस्तित्व की अनदेखी कर रहा है।
लुंडिन

1
C11 मानक ड्राफ्ट के बारे में उल्लेखनीय बात यह है कि भले ही func()अप्रचलित माना जाता है, ड्राफ्ट स्वयं int main()अपने उदाहरणों में उपयोग करता है।
अंती हापाला

29

सफलता पर 0 और त्रुटि के लिए गैर-शून्य पर लौटें। यह UNIX और DOS स्क्रिप्टिंग द्वारा उपयोग किया जाने वाला मानक है जो आपके कार्यक्रम के साथ हुआ।


8

main() C89 और K & R C में अनिर्दिष्ट रिटर्न 'int` के लिए डिफ़ॉल्ट है।

return 1? return 0?
  1. यदि आप रिटर्न स्टेटमेंट नहीं लिखते हैं int main(), तो समापन {0 डिफ़ॉल्ट रूप से होगा।

  2. return 0 या return 1 मूल प्रक्रिया द्वारा प्राप्त किया जाएगा। एक शेल में यह एक शेल वैरिएबल में चला जाता है, और यदि आप अपना प्रोग्राम चला रहे हैं तो एक शेल बनाते हैं और उस वैरिएबल का उपयोग नहीं करते हैं तो आपको रिटर्न वैल्यू के बारे में चिंता करने की आवश्यकता नहीं है main()

देखें कि मैं कैसे प्राप्त कर सकता हूं जो मेरा मुख्य कार्य वापस आ गया है?

$ ./a.out
$ echo $?

इस तरह आप देख सकते हैं कि यह परिवर्तनशील है $? जो रिटर्न वैल्यू का सबसे कम महत्वपूर्ण बाइट प्राप्त करता है main()

यूनिक्स और डॉस स्क्रिप्टिंग में, return 0सफलता पर और त्रुटि के लिए गैर-शून्य आमतौर पर वापस आ जाते हैं। यह यूनिक्स और डॉस स्क्रिप्टिंग द्वारा उपयोग किया जाने वाला मानक है जो यह पता लगाने के लिए कि आपके कार्यक्रम के साथ क्या हुआ और पूरे प्रवाह को नियंत्रित करता है।


4
सख्ती से बोलना, $?एक पर्यावरण चर नहीं है; यह एक शेल पूर्वनिर्धारित (या अंतर्निहित) चर है। अंतर हाजिर करना मुश्किल है, लेकिन यदि आप env(बिना किसी तर्क के) चलाते हैं , तो यह पर्यावरण को प्रिंट करता है, और पर्यावरण में $?नहीं दिखाया जाएगा।
जोनाथन लेफ़लर

1
0 स्वचालित रूप से लौटना जब मुख्य "अंत का पतन" केवल C ++ और C99 में होता है, C90 में नहीं।
काज

टाइपो: "समापन {" होना चाहिए }। SO मुझे इस छोटे को संपादित करने की अनुमति नहीं देगा।
स्पेंसर

7

ध्यान रखें कि, भले ही आप एक इंट लौट रहे हों, कुछ OSes (Windows) लौटे हुए मान को एक बाइट (0-255) में काट देते हैं।


4
यूनिक्स वही करता है, जैसा कि ज्यादातर अन्य ऑपरेटिंग सिस्टम करते हैं। मुझे पता है कि वीएमएस इसके साथ ऐसी अविश्वसनीय अजीब चीजें करता है कि EXIT_SUCCESS या EXIT_FAILURE के अलावा कुछ भी वापस करना परेशानी के लिए पूछ रहा है।
लियोन टिम्मरमन्स

2
MSDN से भिन्न होता है: जब mscorlib के माध्यम से रिपोर्ट किया जाता है, तो एक निकास कोड एक हस्ताक्षरित 32-बिट पूर्णांक होता है । इसका अर्थ यह लगता है कि C रनटाइम लाइब्रेरी जो एक्ज़िट कोड को काटती हैं, दोषपूर्ण हैं।

हां, यह गलत है। विंडोज पर एक 32-बिट पूर्णांक लौटाया जाता है (और परिवर्तित unsigned)। यह 32-बिट पूर्णांक के साथ UNIX सिस्टम पर समान है। लेकिन यूनिक्स-शैली के गोले या तो सिस्टम पर आमतौर पर केवल एक 8-बिट पूर्णांक बनाए रखेंगे।
जॉन मैक्फर्लेन

4

वापसी मान का उपयोग ऑपरेटिंग सिस्टम द्वारा यह जांचने के लिए किया जा सकता है कि प्रोग्राम को कैसे बंद किया गया था।

रिटर्न मान 0 का मतलब आमतौर पर अधिकांश ऑपरेटिंग सिस्टमों में ठीक होता है (जिन्हें मैं वैसे भी सोच सकता हूं)।

यह तब भी जांचा जा सकता है जब आप स्वयं किसी प्रक्रिया को कॉल करते हैं, और देखें कि क्या प्रोग्राम बाहर निकला और ठीक से समाप्त हुआ।

यह नहीं सिर्फ एक प्रोग्रामिंग सम्मेलन।


प्रश्न में कुछ भी नहीं है जो दर्शाता है कि एक ऑपरेटिव प्रणाली मौजूद है। किसी फ्रीस्टैंडिंग सिस्टम में वैल्यू लौटाने का कोई मतलब नहीं है।
लंडिन

3

वापसी का मूल्य main()दिखाता है कि कार्यक्रम कैसे बाहर निकल गया। यदि रिटर्न मान है zeroतो इसका मतलब है कि निष्पादन सफल था जबकि कोई भी गैर-शून्य मूल्य यह दर्शाता है कि निष्पादन में कुछ खराब हो गया था।


1
यह एक टिप्पणी है जो सवाल का जवाब नहीं है।
लंडिन

2

मैं इस धारणा के तहत था कि मानक निर्दिष्ट करता है कि मुख्य को रिटर्न वैल्यू की आवश्यकता नहीं है क्योंकि एक सफल रिटर्न ओएस आधारित था (एक में शून्य या तो एक सफलता या किसी अन्य में विफलता हो सकती है), इसलिए वापसी की अनुपस्थिति एक क्यू के लिए थी संकलक सफल रिटर्न डालने के लिए।

हालांकि मैं आमतौर पर 0 वापस करता हूं।


C99 (और C ++ 98) आपको मुख्य से रिटर्न स्टेटमेंट को छोड़ने की अनुमति देता है; C89 आपको रिटर्न स्टेटमेंट को छोड़ने की अनुमति नहीं देता है।
जोनाथन लेफ्लर 5

यह एक टिप्पणी है एक जवाब नहीं।
लंडिन

यह प्रश्न का उत्तर प्रदान नहीं करता है। किसी लेखक से स्पष्टीकरण मांगने या उसका अनुरोध करने के लिए, उनके पोस्ट के नीचे एक टिप्पणी छोड़ दें।
स्टीव लिलिस

6
@SteveLillis: 2008 में SO के पास एक टिप्पणी अनुभाग नहीं था।
graham.reeds

2

रिटर्निंग 0 प्रोग्रामर को बताना चाहिए कि प्रोग्राम ने सफलतापूर्वक काम पूरा कर लिया है।


main()सामान्य रूप से सिग्नल से 1 लौटना एक त्रुटि हुई; वापसी 0 संकेत सफलता। यदि आपके कार्यक्रम हमेशा विफल होते हैं, तो 1 ठीक है, लेकिन यह सबसे अच्छा विचार नहीं है।
जोनाथन लेफ्लर

1
@JonathanLeffler: लौटने के अर्थ 1से mainकार्यान्वयन परिभाषित किया गया है। केवल भाषा-परिभाषित मूल्य हैं 0, EXIT_SUCCESS(अक्सर के रूप में परिभाषित 0), और EXIT_FAILURE। OpenVMS में, सफल समाप्ति return 1;को दर्शाता है ।
कीथ थॉम्पसन

वीएमएस 'सामान्य' नहीं है - मैंने जो कहा उसके अर्थ के भीतर। क्या यह कुछ ऐसा नहीं है 'कोई भी विषम मूल्य सफलता है; यहां तक ​​कि मानों वीएमएस पर विफलता है?
जोनाथन लेफ़लर

2

न आना return 0

जब सी या सी ++ प्रोग्राम mainकम्पाइलर के अंत तक पहुँच जाता है तो स्वचालित रूप से 0 वापस करने के लिए कोड उत्पन्न करेगा, इसलिए return 0;अंत में स्पष्ट रूप से डालने की कोई आवश्यकता नहीं है main

नोट: जब मैं यह सुझाव देता हूं, तो यह लगभग हमेशा दो प्रकार की टिप्पणियों में से एक होता है: "मुझे यह नहीं पता था"। या "यह बुरी सलाह है!" मेरा तर्क यह है कि यह मानक द्वारा स्पष्ट रूप से समर्थित संकलक व्यवहार पर भरोसा करने के लिए सुरक्षित और उपयोगी है। C के लिए, C99 के बाद से; आईएसओ / आईईसी 9899 देखें: 1999 खंड 5.1.2.2.3:

[...] mainफ़ंक्शन के लिए प्रारंभिक कॉल से वापसी फ़ंक्शन को उसके तर्क के रूप exitमें mainफ़ंक्शन द्वारा लौटाए गए मान के साथ कॉल करने के बराबर है ; }उस तक पहुंचने वाले mainफ़ंक्शन को 0 का मान लौटाता है।

सी ++ के लिए, 1998 में पहले मानक के बाद से; आईएसओ / आईईसी 14882 देखें: 1998 खंड 3.6.1:

यदि नियंत्रण रिटर्न स्टेटमेंट को प्राप्त किए बिना मुख्य के अंत तक पहुंचता है, तो प्रभाव रिटर्न निष्पादित करने का है;

तब से (C99 और C ++ 98) दोनों मानकों के सभी संस्करणों ने एक ही विचार बनाए रखा है। हम सी ++ में स्वचालित रूप से उत्पन्न सदस्य कार्यों पर भरोसा करते हैं, और कुछ लोग फ़ंक्शन return;के अंत में स्पष्ट कथन लिखते हैं void। ओमिंग के खिलाफ कारण "यह अजीब लग रहा है" को उबालने लगता है । यदि, मेरी तरह, आप C मानक में परिवर्तन के लिए तर्क के बारे में उत्सुक हैं, तो यह प्रश्न पढ़ें । यह भी ध्यान दें कि 1990 के दशक की शुरुआत में इसे "मैला व्यवहार" माना जाता था क्योंकि यह उस समय अपरिभाषित व्यवहार (हालांकि व्यापक रूप से समर्थित) था।

इसके अतिरिक्त, C ++ कोर दिशानिर्देशोंreturn 0; के अंत में छोड़ने के कई उदाहरण हैं mainऔर ऐसे कोई उदाहरण नहीं हैं जिनमें स्पष्ट रिटर्न लिखा गया हो। यद्यपि उस दस्तावेज़ में इस विशेष विषय पर अभी तक कोई विशिष्ट दिशानिर्देश नहीं है, जो कि अभ्यास का कम से कम मौन समर्थन लगता है।

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


2
यह बुरी सलाह है क्योंकि संकलक जो केवल C89 को लागू करते हैं, किसी भी बाद के मानक नहीं, अभी भी बेहद सामान्य हैं (मैं इसे 2017 में लिखता हूं) और भविष्य के लिए बेहद सामान्य रहेगा। उदाहरण के लिए, अंतिम बार मैंने Microsoft के कंपाइलरों का कोई संस्करण C99 लागू नहीं किया था, और यह मेरी समझ है कि यह अभी भी एम्बेडेड सिस्टम कंपाइलरों के लिए विशिष्ट है जो GCC नहीं हैं।
zwol

4
@zwol: कोई भी व्यक्ति जिसके पास 28 वर्षों से पुराने किसी कंपाइलर का उपयोग करने के अलावा कोई विकल्प नहीं है, शायद यह तय करने की तुलना में अधिक समस्याएं हैं कि क्या स्पष्ट रूप से शामिल किया return 0;जाना चाहिए, लेकिन मैं ध्यान दूंगा कि उस युग के कई कंपाइलरों ने return 0;इसके पहले भी एक निहितार्थ लागू किया था। मानकीकरण किया।
एडवर्ड

2
वास्तव में, मैं बहुत सारे एम्बेडेड सिस्टम काम करता हूं और एक संकलक का सामना नहीं return 0किया है जो एक दशक से अधिक समय तक निहित का समर्थन नहीं करता है । Microsoft C के वर्तमान संस्करण भी इसका समर्थन करते हैं । शायद आपकी जानकारी पुरानी है?
एडवर्ड

2
मैं सी, लगभग (प्रति @zwol) में विवादास्पद होने की सराहना कर सकता हूं। C ++ में इसके आसपास का कोई भी विवाद शुद्ध बकवास है।
ऑर्बिट

2
@ इससे पहले कि मैंने यह नहीं कहा कि विवाद मौजूद नहीं था, मैंने कहा कि यह बकवास था: P
लाइटनेस दौड़ ऑर्बिट

1

क्या लौटना है यह इस पर निर्भर करता है कि आप निष्पादन योग्य के साथ क्या करना चाहते हैं। उदाहरण के लिए यदि आप कमांड लाइन शेल के साथ अपने प्रोग्राम का उपयोग कर रहे हैं, तो आपको एक सफलता के लिए 0 और विफलता के लिए एक गैर शून्य की आवश्यकता है। तब आप अपने कोड के परिणाम के आधार पर सशर्त प्रसंस्करण के साथ गोले में कार्यक्रम का उपयोग करने में सक्षम होंगे। इसके अलावा, आप अपनी व्याख्या के अनुसार कोई भी नॉनज़ेरो वैल्यू असाइन कर सकते हैं, उदाहरण के लिए क्रिटिकल एरर्स के लिए अलग-अलग प्रोग्राम एग्ज़िट पॉइंट, विभिन्न एग्ज़िट वैल्यू वाले प्रोग्राम को समाप्त कर सकते हैं, और जो कॉलिंग शेल के लिए उपलब्ध है, जो यह तय कर सकता है कि लौटाए गए वैल्यू का निरीक्षण करके क्या करना है। यदि कोड गोले के साथ उपयोग करने के लिए अभिप्रेत नहीं है और लौटाया गया मान किसी को परेशान नहीं करता है तो इसे छोड़ दिया जा सकता है। मैं व्यक्तिगत रूप से हस्ताक्षर का उपयोग करता हूंint main (void) { .. return 0; .. }


मुख्य () का प्रारूप कार्यान्वयन, अर्थ संकलक द्वारा निर्धारित किया जाता है। प्रोग्रामर को नहीं चुना जाता है कि किस फॉर्म को चुनना है, सिवाय इसके जब एक कंपाइलर कई रूपों का समर्थन करता है।
लंडिन

@ लुंडिन वापसी प्रकार कार्यान्वयन द्वारा लागू किया जाएगा। लेकिन जो मूल्य वापस किया जाना है, वह प्रोग्रामर द्वारा तय किया जाता है। C99 खंड 5.1.2.2.3 में उल्लेख किया गया है कि वापसी प्रकार के mainसाथ संगत है int। इसलिए वापस लौटना intकोई समस्या नहीं होगी। हालांकि अन्य रिटर्न प्रकारों की अनुमति है, लेकिन उस स्थिति में रिटर्न वैल्यू वाले पर्यावरण चर अनिर्दिष्ट होंगे। लेकिन अगर कोई प्रोग्रामर करता है return 0;तो बैश में इसका इस्तेमाल शाखाओं को बनाने में किया जा सकता है।
फॉक्सिस

1

यदि आपके पास वास्तव में किसी प्रक्रिया से पूर्णांक वापस करने की दक्षता से संबंधित समस्याएँ हैं, तो आपको संभवतः उस प्रक्रिया को इतनी बार कॉल करने से बचना चाहिए कि यह वापसी मान एक मुद्दा बन जाए।

यदि आप ऐसा कर रहे हैं (एक प्रक्रिया को कई बार कॉल करें), तो आपको प्रत्येक कॉल के लिए एक विशिष्ट प्रक्रिया को आवंटित किए बिना, अपने तर्क को सीधे कॉलर के अंदर, या एक डीएलएल फ़ाइल में खोजने का तरीका ढूंढना चाहिए; एकाधिक प्रक्रिया आवंटन आपको इस मामले में प्रासंगिक दक्षता समस्या लाते हैं।

विस्तार से, यदि आप केवल यह जानना चाहते हैं कि रिटर्निंग 1 लौटने से अधिक या कम कुशल है, तो यह कुछ मामलों में कंपाइलर से निर्भर हो सकता है, लेकिन उदारतापूर्वक, यह मानते हुए कि वे एक ही स्रोत (स्थानीय, क्षेत्र, निरंतर, एम्बेडेड से पढ़े जाते हैं) कोड, फ़ंक्शन परिणाम, आदि में) इसे ठीक उसी तरह की घड़ी चक्र की आवश्यकता होती है।


1

यहाँ रिटर्न कोड के उपयोग का एक छोटा प्रदर्शन है ...

लिनक्स टर्मिनल प्रदान करता है कि विभिन्न उपकरणों का उपयोग करते समय एक त्रुटि कोड से निपटने के लिए उदाहरण के लिए उपयोग कर सकते हैं प्रक्रिया पूरी होने के बाद। कल्पना करें कि निम्न पाठ फ़ाइल myfile मौजूद है:

यह जांचने के लिए कुछ उदाहरण है कि grep कैसे काम करता है।

जब आप grep कमांड निष्पादित करते हैं तो एक प्रक्रिया बनाई जाती है। एक बार जब यह होता है (और टूटता नहीं) तो यह 0 और 255 के बीच कुछ कोड देता है। उदाहरण के लिए:

$ grep order myfile

यदि तुम करो

$ echo $?
$ 0

आपको एक 0. क्यों मिलेगा? क्योंकि grep ने एक मैच पाया और एक एक्जिट कोड 0 लौटाया, जो कि सफलता के साथ बाहर निकलने का सामान्य मूल्य है। आइए इसे फिर से देखें लेकिन ऐसी चीज़ के साथ जो हमारी टेक्स्ट फ़ाइल के अंदर नहीं है और इस तरह कोई मैच नहीं मिलेगा:

$ grep foo myfile
$ echo $?
$ 1

चूंकि grep हमारी फ़ाइल की सामग्री के साथ टोकन "foo" से मेल करने में विफल रहा है इसलिए रिटर्न कोड 1 है (यह सामान्य मामला है जब विफलता होती है लेकिन जैसा कि ऊपर कहा गया है कि आपके पास चुनने के लिए बहुत सारे मूल्य हैं)।

अब निम्नलिखित बैश स्क्रिप्ट (बस इसे लिनक्स टर्मिनल में टाइप करें) हालांकि बहुत बुनियादी को त्रुटि से निपटने का कुछ विचार देना चाहिए:

$ grep foo myfile
$ CHECK=$?
$ [ $CHECK -eq 0] && echo 'Match found'
$ [ $CHECK -ne 0] && echo 'No match was found'
$ No match was found

दूसरी पंक्ति के बाद टर्मिनल में कुछ भी नहीं छापा जाता है क्योंकि "फू" ने grep रिटर्न 1 बनाया है और हम जांचते हैं कि क्या grep का रिटर्न कोड 0. के बराबर था। दूसरा सशर्त विवरण अंतिम पंक्ति में इसके संदेश को गूँजता है क्योंकि यह CHECK के कारण सही है == १।

जैसा कि आप देख सकते हैं कि क्या आप इसे कॉल कर रहे हैं और यह प्रक्रिया कभी-कभी यह देखने के लिए आवश्यक है कि यह क्या लौटा है (मुख्य के वापसी मूल्य द्वारा) ()।


एक शेल स्क्रिप्ट में, आप उपयोग करेंगे if grep foo myfile; then echo 'Match found'; else echo 'No match was found'; fi- सीधे रिटर्न स्थिति का परीक्षण। यदि आप स्थिति (रिपोर्टिंग, आदि के लिए) पर कब्जा करना चाहते हैं, तो आप असाइनमेंट का उपयोग करते हैं। आप उपयोग if grep foo myfile; CHECK=$?; [ "$CHECK" = 0 ]; then echo 'Match found'; else echo 'No match was found'; fiकर सकते हैं या आप तीन लाइनों का उपयोग कर सकते हैं। तुम भी विकल्पों का उपयोग कर सकते हैं -sऔर -qकरने के लिए grepप्रदर्शित होने से मेल खाता है या नियमित त्रुटि संदेश को रोकने के लिए। हालांकि, यह शेल माइनुटिया है - प्रमुख बिंदु, कि बाहर निकलने की स्थिति उपयोगी हो सकती है - ठीक है।
जोनाथन लेफ़लर

1

C और C ++ में मुख्य () फ़ंक्शन को परिभाषित करने का सही (सबसे कुशल) तरीका क्या है - int main () या void main () - और क्यों?

वे शब्द "(सबसे कुशल)" सवाल नहीं बदलते हैं। जब तक आप एक फ्रीस्टैंडिंग वातावरण में नहीं होते हैं, तब तक घोषित करने के लिए एक सार्वभौमिक सही तरीका है main(), और यह इंट के रूप में वापस आ रहा है।

main()C और C ++ में क्या लौटना चाहिए ?

यह नहीं है कि क्या लौटना चाहिए main() , यह वह है जो वापसी करता है main()main()बेशक, एक फ़ंक्शन जो किसी और को कॉल करता है। आपके पास कॉल करने वाले कोड पर कोई नियंत्रण नहीं है main()। इसलिए, आपको main()इसके कॉलर से मिलान करने के लिए एक सही-सही हस्ताक्षर की घोषणा करनी चाहिए । आप बस इस मामले में कोई विकल्प नहीं है। आपको खुद से यह पूछने की ज़रूरत नहीं है कि अधिक या कम कुशल क्या है, या क्या बेहतर या बदतर शैली है, या ऐसा कुछ भी है, क्योंकि उत्तर पहले से ही पूरी तरह से परिभाषित है, आपके लिए, सी और सी + मानकों द्वारा। बस उनका अनुसरण करें।

यदि int main () है तो 1 लौटाएँ या 0 लौटाएँ?

सफलता के लिए 0, असफलता के लिए नॉनजरो। फिर से, कुछ ऐसा नहीं है जिसे आपको लेने (या प्राप्त करने) की आवश्यकता है: यह उस इंटरफ़ेस द्वारा परिभाषित किया जाता है जिसे आप के अनुरूप होना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.