2010-11-17 15 views
121

सी ++ में main फ़ंक्शन का उचित हस्ताक्षर क्या है? सही रिटर्न प्रकार क्या है, और main से मूल्य वापस करने का क्या अर्थ है? अनुमत पैरामीटर प्रकार क्या हैं, और उनके अर्थ क्या हैं?मुख्य की उचित घोषणा क्या है?

क्या यह सिस्टम-विशिष्ट है? क्या समय के साथ ये नियम बदल गए हैं? अगर मैं उनका उल्लंघन करता हूं तो क्या होता है?

+0

यह बहुत बारीकी से संबंधित है, या क्या करना चाहिए, की [डुप्लिकेट सी और सी ++ में 'मुख्य' वापसी] (http://stackoverflow.com/questions/204476/what-sho uld-मुख्य-रिटर्न-इन-सी और सी/18721336 # 18721336)। –

+0

@ जोनाथन लेफ्लर कोई मजाक नहीं कर रहा है ... इसे लगभग 8 महीने पहले [संशोधन 6] (http://stackoverflow.com/revisions/204476/6) में डुप्लिकेट की सूची में जोड़ा गया था। – fredoverflow

उत्तर

151

main फ़ंक्शन को वैश्विक नामस्थान में गैर-सदस्य फ़ंक्शन के रूप में घोषित किया जाना चाहिए। इसका मतलब यह है कि यह एक वर्ग का स्थिर या गैर स्थैतिक सदस्य कार्य नहीं हो सकता है, न ही इसे नामस्थान (यहां तक ​​कि नामित नामस्थान) में रखा जा सकता है।

नाम main वैश्विक नामस्थान में एक समारोह के अलावा C++ में आरक्षित नहीं है। आप main नामक अन्य संस्थाओं को घोषित करने के लिए स्वतंत्र हैं, जिनमें अन्य चीजें, कक्षाएं, चर, गणना, सदस्य कार्य, और गैर-सदस्य फ़ंक्शंस शामिल हैं, जो वैश्विक नामस्थान में नहीं हैं।

आप सदस्य फ़ंक्शन या नामस्थान में main नामक फ़ंक्शन घोषित कर सकते हैं, लेकिन ऐसा फ़ंक्शन main फ़ंक्शन नहीं होगा जो प्रोग्राम कहां से शुरू होता है।

main फ़ंक्शन को static या inline के रूप में घोषित नहीं किया जा सकता है। इसे ओवरलोड नहीं किया जा सकता है; वैश्विक नामस्थान में main नामक केवल एक ही कार्य हो सकता है।

main फ़ंक्शन का उपयोग आपके प्रोग्राम में नहीं किया जा सकता है: आपको अपने कोड में कहीं से भी main फ़ंक्शन कॉल करने की अनुमति नहीं है, और न ही आपको इसका पता लेने की अनुमति है।

वापसी का प्रकार mainint होना चाहिए। कोई अन्य रिटर्न प्रकार की अनुमति नहीं है (यह नियम बोल्ड में है क्योंकि को void के रिटर्न प्रकार के साथ घोषित गलत प्रोग्राम देखने के लिए बहुत आम है; यह main फ़ंक्शन से संबंधित सबसे अधिक बार उल्लंघन नियम है)।

main के दो घोषणाओं कि अनुमति दी जानी चाहिए रहे हैं:

int main()    // (1) 
int main(int, char*[]) // (2) 

(1) में, वहाँ कोई मापदंड हैं।

(2), वहाँ दो मापदंडों हैं और वे पारंपरिक argc और argv क्रमश: नाम हैं। argv प्रोग्राम के तर्कों का प्रतिनिधित्व करते हुए सी स्ट्रिंग्स की एक सरणी के लिए एक सूचक है। argcargv सरणी में तर्कों की संख्या है।

आमतौर पर, argv[0] में प्रोग्राम का नाम होता है, लेकिन यह हमेशा ऐसा नहीं होता है। argv[argc] एक शून्य सूचक होने की गारंटी है।

ध्यान दें कि एक सरणी प्रकार तर्क के बाद से (जैसे char*[]) वास्तव में भेष में सिर्फ एक सूचक प्रकार तर्क है, निम्नलिखित दो दोनों वैध तरीके लिखने के लिए कर रहे हैं (2) और वे दोनों मतलब बिल्कुल वही बात:

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

कुछ कार्यान्वयन अन्य प्रकारों और पैरामीटर की संख्या की अनुमति दे सकते हैं; आपको यह देखने के लिए अपने कार्यान्वयन के दस्तावेज़ीकरण की जांच करनी होगी कि यह क्या समर्थन करता है।

main() विफलता को इंगित करने के लिए सफलता और शून्य-शून्य इंगित करने के लिए शून्य लौटने की उम्मीद है। आपको main() में return कथन स्पष्ट रूप से लिखने की आवश्यकता नहीं है: यदि आप main() स्पष्ट return कथन के बिना वापस आते हैं, तो यह वही है जैसे आपने return 0; लिखा था।

int main() { } 
int main() { return 0; } 

दो मैक्रो, EXIT_SUCCESS और EXIT_FAILURE, <cstdlib> में परिभाषित किया गया है कि यह भी सफलता और विफलता के क्रमश: इंगित करने के लिए main() से लौटाया जा सकता हैं: निम्न दो main() कार्यों समान व्यवहार किया है।

main() द्वारा लौटाया गया मूल्य exit() फ़ंक्शन पर भेज दिया गया है, जो प्रोग्राम को समाप्त करता है।

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

+1

आईआईआरसी केवल गारंटीकृत वापसी मान 0, EXIT_SUCCESS (0 के समान प्रभाव), और EXIT_FAILURE हैं।संपादित करें: आह, ठीक है, अन्य गैर शून्य स्थिति मान वापस लौटाए जा सकते हैं, लेकिन कार्यान्वयन-परिभाषित अर्थ के साथ। विफलता मान के रूप में केवल EXIT_FAILURE को किसी तरीके से व्याख्या करने की गारंटी है। –

+0

यह निर्दिष्ट करने के लिए चोट नहीं पहुंचाएगा (केवल यह सुनिश्चित करने के लिए) कि यह सी ++ के संदर्भ में है। जावा/सी # उपयोगकर्ताओं को भ्रमित किया जा सकता है क्योंकि उन भाषाओं में वास्तव में * एंट्री पॉइंट-काउंटरिंट्यूटिव रूप से एक कक्षा में होना चाहिए (किसी कारण से)। साथ ही, पुराना 'शून्य मुख्य' प्रारूप सी से होल्डओवर नहीं है? – Synetech

+3

@ सिनेटैक: प्रश्न अपनी पहली वाक्य में पूछता है, "सी ++ में मुख्य समारोह का उचित हस्ताक्षर क्या है?" और सवाल दोनों [सी ++] और [सी ++ - faq] टैग किया गया है। अगर जावा या सी # उपयोगकर्ता (या कोई और) अभी भी उलझन में हैं तो मैं इसकी मदद नहीं कर सकता। सी # के लिए 'मुख्य' एक स्थिर सदस्य फ़ंक्शन होना आवश्यक है क्योंकि इसमें गैर-कार्य फ़ंक्शन भी नहीं हैं। यहां तक ​​कि C89 को 'int' को 'int' वापस करने की आवश्यकता है। मैं अपने सटीक नियमों को जानने के लिए के एंड आर सी के साथ पर्याप्त रूप से परिचित नहीं हूं, लेकिन मुझे लगता है कि इसे 'मुख्य' के रूप में 'मुख्य' के रूप में 'मुख्य' के रूप में वापस करने की आवश्यकता होती है, जिसमें कोई वापसी प्रकार कुछ आम नहीं था और कोई प्रकार = अंतर्निहित 'int' के एंड आर में नहीं । –

3

दो वैध मुख्य भाग मुख्य मुख्य() और int मुख्य (int, char * []) ​​हैं और कोई भी चीज़ संकलित या हो सकती है। यदि मुख्य रूप से कोई मान 0 वापस नहीं लौटाता है तो वह पूरी तरह से वापस आ जाता है।

+0

मैंने कभी भी कोड को संकलित नहीं किया है जब मैं शून्य के रिटर्न प्रकार का उल्लेख शून्य मानता हूं। ** क्या कोई विशिष्ट कारण है कि मुख्य प्रकार का मुख्य प्रकार int होना चाहिए? ** –

+4

भाषा विनिर्देश कहता है कि मुख्य में वापसी का प्रकार होना चाहिए। आपके कंपाइलर द्वारा अनुमत कोई अन्य रिटर्न प्रकार एक कंपाइलर विशिष्ट वृद्धि है। मूल रूप से शून्य का उपयोग करने का मतलब है कि आप एक भाषा में प्रोग्रामिंग कर रहे हैं लेकिन सी ++ नहीं। – stonemetal

+2

मानक को 'int' के रिटर्न प्रकार के रूप में 'int' की आवश्यकता होती है, यह यह है कि यह मान शैल को प्रोग्राम के निकास कोड के रूप में सौंप दिया जाता है, और' sh' 'int' की अपेक्षा करता है। – uckelman

11
स्टैंडर्ड डॉक्स से

।, 3.6.1.2 मुख्य समारोह,

यह प्रकार int की वापसी प्रकार होगा, लेकिन अन्यथा अपने प्रकार कार्यान्वयन परिभाषित किया गया है।

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

बाद वाले मिलकर argc में पर्यावरण से कार्यक्रम के लिए पारित तर्क की संख्या में किया जाएगा: सभी कार्यान्वयन मुख्य के निम्नलिखित परिभाषाओं के दोनों अनुमति देते हैं जाएगा जिसमें प्रोग्राम चलाया जाता है। अगर argc nonzero है तो ये तर्क argv [0] में argv [argc-1] के माध्यम से इंगित करने के लिए इंगित किए जाएंगे नल-टर्मिनेटेड मल्टीबाइट स्ट्रिंग्स के ial वर्ण .....

आशा है कि मदद करता है ..वापसी मूल्यों पर

+1

क्या कोई विशिष्ट कारण है कि 'मुख्य' का रिटर्न प्रकार 'int' क्यों होना चाहिए? –

+1

@ सुहैलगुप्त: ताकि कॉलिंग प्रक्रिया जानता है कि _this_ प्रक्रिया को सफल माना जाना चाहिए या नहीं। मॉडल को 'शून्य' तोड़ने की इजाजत दी गई है। यदि आप इसका मतलब "हमेशा सफलता मानते हैं" तो यह वास्तव में भी समझ में नहीं आता है। क्योंकि आपके पास यह कहने का कोई तरीका नहीं था कि प्रक्रिया वास्तव में विफल रही है, तो क्या आपने _really_ सफल किया? नहीं, वापस 'int'। –

2

विवरण और उनके अर्थ

प्रति 3.6.1 ([basic.start.main]):

main में एक वापसी कथन main समारोह (स्वत: के साथ किसी भी वस्तुओं को नष्ट करने छोड़ने का प्रभाव पड़ता है संग्रहण अवधि) और तर्क के रूप में वापसी मूल्य के साथ std::exit पर कॉल करना। नियंत्रण एक return बयान का सामना किए बिना main के अंत तक पहुँच जाता है, प्रभाव है कि

return 0; 

को क्रियान्वित करने के std::exit के व्यवहार खंड 18.5 ([support.start.term]) में विस्तृत है है, और स्थिति कोड का वर्णन करता है:

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

3

नवीनतम प्रकाशित मानक (सी ++ 14) की सटीक शब्द है:

कार्यान्वयन दोनों

  • अनुमति देते हैं जाएगा () के एक समारोह लौटने int और

  • (int का एक फ़ंक्शन, पॉइंटर सेपर सूचक 0 main के प्रकार के रूप int

लौटने।

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

  • int main(void)
  • auto main() -> int
  • int main ( )
  • signed int main()
  • typedef char **a; typedef int b, e; e main(b d, a c)
+1

एनबी। मैंने इस उत्तर को अन्य थ्रेड पर टिप्पणियों के रूप में पोस्ट किया है, किसी ने इस धागे को इस सबूत के रूप में उद्धृत करने का प्रयास किया है कि 'int मुख्य (शून्य) 'सी ++ में सही नहीं था। –

+3

@Stargateur 'ऑटो मुख्य() -> int' में एक कटौती वापसी प्रकार नहीं है। {In "(ऑटो मुख्य() {... की अनुमति नहीं है) पर ध्यान दें" और कृपया यह जानना सीखें कि आप अभी तक कुछ भी अर्थपूर्ण जोड़ने के लिए पर्याप्त नहीं जानते हैं। – hvd

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