2011-12-04 10 views
5

मैं कुछ चीजों की गणना के लिए एक त्वरित कार्यक्रम लिख रहा था जब मैं सी कार्यक्रम के लिए रिटर्न स्टेटमेंट/एक्जिट स्टेटमेंट में आया था।क्या यह मुख्य() में एक मूल्य वापस करने के लिए आवश्यक है?

मैंने main() को int टाइप करने के लिए घोषित किया, इसलिए मुझे एक पूर्णांक की वापसी में रखना होगा, या मेरा प्रोग्राम सही ढंग से संकलित नहीं होगा। हालांकि, क्या यह mainBoolean या यहां तक ​​कि void बनाने के लिए स्वीकार्य है?

मुझे पता है कि एक सी प्रोग्राम बनाने का मानक तरीका एक मूल्य वापस करना है, इसलिए किसी भी समस्या को अन्य चीजों के साथ हल किया जा सकता है, लेकिन Boolean एक ही तरीके से काम नहीं करेगा? साथ ही, क्या मैं इसे void घोषित करने से दूर हो सकता हूं और ऑपरेटिंग सिस्टम के साथ समस्याएं नहीं होने के बाद भी मेरे प्रोग्राम को समाप्त कर दिया गया है?

किसी भी और सभी मदद के लिए धन्यवाद।

+0

आवश्यक नहीं है, लेकिन आवश्यक है। – Philip

उत्तर

6

C99 मानक का कहना है: (§5.1.2.2.1 कार्यक्रम स्टार्टअप)

समारोह कार्यक्रम स्टार्टअप पर बुलाया मुख्य नाम पर है। कार्यान्वयन इस समारोह के लिए प्रोटोटाइप घोषित करता है। ,

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

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

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

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

तो एक होस्टेड वातावरण में, int एकमात्र वैध, मानक रिटर्न प्रकार है। कार्यान्वयन हालांकि अन्य प्रवेश बिंदु परिभाषित कर सकते हैं।

को प्रारंभिक कॉल से एक वापसी तो मुख्य कार्य की वापसी प्रकार int के साथ एक प्रकार संगत है,:

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

तो तुम main से एक वापसी को छोड़ते हुए जब तक आपके main रिटर्न एक int C99 में कानूनी है,।
(लेकिन सी मानक के पिछले संस्करणों नहीं था main के लिए है कि अपवाद - कोई मूल्य नहीं लौटने (या एक वापसी कथन के बिना अंतिम } तक पहुँचने) "का कारण बनता है समाप्ति स्थिति मेजबान पर्यावरण में आता [होने के लिए] अपरिभाषित । "।)

+0

'या कुछ अन्य कार्यान्वयन-परिभाषित तरीके में' -> यह व्याख्या के लिए बहुत अधिक जगह छोड़ देता है :-) – jdehaan

+0

@jdehaan: वास्तव में नहीं; "कार्यान्वयन-परिभाषित" का अर्थ कुछ ऐसा है जो कार्यान्वयन द्वारा स्पष्ट रूप से दस्तावेज किया गया है। –

+1

यह उल्लेखनीय है कि सी 0 9 में, '}' तक पहुंचने से एक अनिर्धारित स्थिति आती है। –

0

जो कोड मुख्य कहता है() उम्मीद करता है कि वह int (या बाहर निकलें() को कॉल करें)। आप उस कोड को नहीं बदल सकते जो मुख्य() (यह ओएस या रनटाइम का हिस्सा है) कहता है, तो आप बेहतर वापसी करेंगे।

2

यहां एक link है जो ब्याज का हो सकता है। लगता है कि आपके प्रश्न का उत्तर सीधे नहीं है। मैंने कंप्रेसर (एमएस विजुअल सी) को रिटर्न प्रकार के रूप में void स्वीकार कर लिया है।

+0

वास्तव में बहुत दिलचस्प है! – nmagerko

+1

"होस्टेड" और "फ्रीस्टैंडिंग" कार्यान्वयन के बीच एक अंतर है। ओपी को एक होस्टेड कार्यान्वयन माना जाना चाहिए, और इसलिए उसे मानक के साथ रहना चाहिए। बोर्लैंड, माइक्रोसॉफ्ट और हर्ब शिलल्ट भाषा को अपने स्वयं के अर्थशास्त्र के साथ प्रदूषित कर सकते हैं, लेकिन उन्हें इसे "मानक" नाम नहीं देना चाहिए। – wildplasser

0

मानक, प्रति आईएसओ, एक int वापस करने के लिए है। इस दस्तावेज़ के खंड 5.1.2.2.1 देखें: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf। सी और सी ++: http://www2.research.att.com/~bs/bs_faq2.html#void-main दोनों से संबंधित इस मामले पर स्ट्रॉस्ट्रप की टिप्पणी भी दिलचस्प है।

0

वापसी का प्रकार int होना चाहिए, जैसा कि अन्य उत्तरों द्वारा कवर किया गया है। हालांकि आपकी धारणा है कि आपको इस पर एक मूल्य वापस करना होगा क्योंकि यह गलत है, main एक अपवाद है। सी 99 मानक इसके लिए प्रदान करता है, इसलिए return का उपयोग किए बिना मुख्य रूप से लागू करना बिल्कुल ठीक है।

0

एएनएसआई सी में, main() आमतौर पर int का रिटर्न प्रकार होता है, लेकिन यह वास्तव में कार्यान्वयन-परिभाषित किया जा सकता है; इसका मतलब है कि अलग-अलग कंपाइलर और प्लेटफॉर्म अलग-अलग हस्ताक्षर स्वीकार करते हैं, लेकिन और int main (int, char**) की गारंटी के अनुसार मानक हैं।

यह अन्य गैर-शून्य कार्यों के विपरीत है, इसमें return कथन की आवश्यकता नहीं है। इस मामले में कि कोई भी आपूर्ति नहीं की जाती है, और वापसी का प्रकार int के रूप में निर्दिष्ट किया गया है, तो कार्यक्रम को संकलित किया गया है जैसे कि main() में अंतिम विवरण के बाद return 0; निहित था।

मानक के प्रासंगिक भाग:

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

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

इस पर मुझे बोली मत करो, लेकिन कश्मीर + आर में, हालांकि, चीजों को एक छोटे से हारने थे, और मुझे लगता है कि आप भी एक वापसी प्रकार निर्दिष्ट करने की आवश्यकता नहीं किया, इसलिए main() { } वास्तव में एक है वैध के + आर कार्यक्रम।

+0

'int मुख्य (शून्य)', 'int मुख्य()' नहीं। और के एंड आर सी (और 1 9 8 9 में एएनएसआई सी/1 99 0 आईएसओ सी) में, यदि आप वापसी प्रकार को छोड़ देते हैं तो यह 'int' पर डिफ़ॉल्ट हो जाता है। 1 999 के आईएसओ सी मानक में यह नियम गिरा दिया गया था। इसका लाभ उठाना कभी अच्छा विचार नहीं है। –

+0

बिल्कुल, ज़ाहिर है। मुझे लगता है कि मेरा सी ++ दिखा रहा है ... – Halfbin

1

सारांश: आपको जरूरी नहीं है, लेकिन आपको चाहिए।

सी 0 9 0 में main() के अंत तक पहुंचने के बिना return कथन निष्पादित किए बिना "होस्ट वातावरण में लौटाई गई समाप्ति स्थिति अपरिभाषित है"। मैंने कम से कम एक सिस्टम का उपयोग किया है, लौटाई गई स्थिति 1 है, जो उस प्रणाली पर इंगित करती है कि प्रोग्राम विफल हुआ।

C99 कह रही है कि main() रिटर्न 0. के अंत तक पहुँचने एक नया नियम जोड़ा है, (सी ++ यही नियम है।) सभी compilers पूरी तरह से C99 लागू नहीं है, और उन है कि अक्सर करते हैं डिफ़ॉल्ट रूप से C99 compilers अनुरूप के रूप में व्यवहार नहीं करते ।

केवल पोर्टेबल मूल्यों आप main() से लौट सकते हैं 0, EXIT_SUCCESS, और EXIT_FAILURE हैं (उत्तरार्द्ध दो <stdlib.h> में परिभाषित कर रहे हैं 0 और EXIT_SUCCESS संकेत मिलता है कि कार्यक्रम सफल रहा है (और EXIT_SUCCESS आमतौर पर 0 के रूप में परिभाषित किया गया है);। EXIT_FAILURE इंगित करता है कि कार्यक्रम असफल रहा। return 1; आम है, लेकिन गैर पोर्टेबल है; मैंने एक सिस्टम (वीएमएस) पर काम किया है, जहां 1 की समाप्ति स्थिति सफलता को इंगित करती है। यदि आप चाहते हैं कि आपका प्रोग्राम पोर्टेबल हो, तो विफलता को इंगित करने के लिए EXIT_FAILURE का उपयोग करें; यही है यह कुछ सिस्टम और प्रोग्राम अन्य सिस्टम-विशिष्ट या एप्लिकेशन-विशिष्ट स्थिति कोड को परिभाषित करता है।

पोर्टेबिलिटी (और, आईएमएचओ, स्टाइल) के लिए, main() के अंत में एक स्पष्ट return 0; करना सर्वोत्तम है, हालांकि सभी परिस्थितियों में इसकी आवश्यकता नहीं है। समय की बर्बादी के मुकाबले कोड की एक पंक्ति (जो सबसे खराब, हानिरहित है) को जोड़ना बहुत आसान है, यह निर्धारित करने के लिए कि आपको इसकी आवश्यकता है या नहीं।

ध्यान दें कि main() के लिए सही परिभाषाएं दी गई हैं:

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

और

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

या समकक्ष (उदाहरण के लिए, आप char **argv बजाय char *argv[] लिख सकते हैं)। यह संदिग्ध है कि int main() { /* ... */ } मान्य है, सूक्ष्म कारणों से मैं यहां नहीं जाऊंगा। फिर, यह निर्धारित करने के लिए कि आपको इसकी आवश्यकता है या नहीं, समय बर्बाद करने के बजाय void कीवर्ड जोड़ना आसान है।

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

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

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