मुख्य () द्वारा लौटाया गया मान किसे प्राप्त होता है?


34

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


7
जब मैं PIC माइक्रोकंट्रोलर के लिए C का उपयोग कर रहा हूं तो मैं हमेशा शून्य मुख्य () का उपयोग करता हूं। माइक्रोकंट्रोलर्स के लिए सी कंपाइलर का उपयोग करते समय, यह वास्तव में बिल्कुल भी मायने नहीं रखता है। क्योंकि कोई ऑपरेटिंग सिस्टम नहीं है जो "main.c" () कहता है। यदि आरटीओएस जैसी कोई चीज उस माइक्रोकंट्रोलर में चल रही है, तो ऑपरेटिंग सिस्टम "main.c" है।
अब्दुल्लाह कहरामन

4
वास्तव में एक डुप्लिकेट नहीं है, लेकिन कम से कम संबंधित: Electronics.stackexchange.com/q/30830/4950
PetPaulsen

1
स्टार्टअप फ़ंक्शन कैसे परिभाषित किया जाता है यह आमतौर पर तय करने के लिए आपके ऊपर नहीं है। आपके द्वारा उपयोग किया जा रहा वातावरण समर्थित स्टार्टअप फ़ंक्शन रूपों का दस्तावेज़ देगा। mainदो अलग-अलग हस्ताक्षरों के साथ दो रूपों का समर्थन करने के लिए होस्टेड सी कार्यान्वयन की आवश्यकता होती है , दोनों वापस लौटते हैं int। यदि आप एक फ्रीस्टैंडिंग सी कार्यान्वयन का उपयोग कर रहे हैं, तो यह कार्यान्वयन निर्धारित करता है कि आपको स्टार्टअप फ़ंक्शन कैसे लिखना चाहिए। आप voidकेवल एक रिटर्निंग फ़ंक्शन नहीं लिख सकते क्योंकि यह वापस नहीं आता है। व्यवहार वापस नहीं के समारोह से अलग है प्रकार समग्र बुला सम्मेलनों प्रभावित करती है जो।
काज

जवाबों:


42

एक माइक्रोकंट्रोलर पर, main()वास्तव में कभी बाहर निकलने की उम्मीद नहीं की जाती है, और यदि यह परिभाषित नहीं होता है तो व्यवहार - इसलिए यह है कि जिसने भी माइक्रोकंट्रोलर के लिए सी रनटाइम लिखा है। मैंने सिस्टम देखा है कि:

  • चारों ओर एक अंतर्निहित लूप है main(), ताकि अगर यह बाहर निकल जाए, तो यह बस फिर से बुलाया जाता है।
  • एक सरल "जंप-टू-सेल्फ" लूप लें जो main()कभी बाहर निकलता है तो निष्पादित हो जाता है।
  • बस उस कोड मेमोरी को निष्पादित करें जो कॉल का अनुसरण करती है main()। इसे "मातम में भागना" कहा जाता है।

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


1
आपने मुझे इसमें हरा दिया। सिंक्रनाइज़ेशन के लिए +1।
एडम लॉरेंस

9
वापसी मान main()को परिभाषित करने वाला C मानक intस्पष्ट रूप से OS-कम माइक्रोकंट्रोलर को ध्यान में रखकर नहीं बनाया गया था। तो यह अनिर्दिष्ट व्यवहार है और आपके सी रनटाइम के आधार पर कुछ भी हो सकता है, जैसा कि डेव ने सूचीबद्ध किया है।
ndim

4
सी एक OS-कम माइक्रोकंट्रोलर पर चल रहे एक फ्रीस्टैंडिंग कार्यान्वयन पर विचार किया जा सकता है, और सी मानक भी करने के लिए एक फ्रीस्टैंडिंग environent की आवश्यकता नहीं होती है एक main()बहुत कम अपनी वापसी मान निर्धारित,। यह कार्यान्वयनकर्ता पर निर्भर है।
कुटलुमाइक

2
@ndim - विभाजन बाल करने के लिए, void main( void )है कार्यान्वयन परिभाषित व्यवहार , नहीं अनिर्दिष्ट व्यवहार
एंड्रयू

1
@MichaelEdenfield: वास्तव में। हालांकि, सी में सभी कोड कार्यों के संदर्भ में परिभाषित किए गए हैं, इसलिए यह पूरी तरह से सी में लिखा गया एक भयावह प्रणाली होना संभव नहीं है; कम से कम विधानसभा भाषा (या जो कुछ भी) का एक छोटा सा होना चाहिए जो एक न्यूनतम वातावरण सेट करता है ताकि एक सी फ़ंक्शन को बुलाया जा सके। उस फ़ंक्शन का सबसे स्पष्ट नाम है main()
डेव ट्वीड

5

एक आम गलतफहमी / मिथक यह है कि int mainमानक द्वारा निर्दिष्ट एकमात्र वैध रूप है। वह सत्य नहीं है।

सी मानक दो कार्यान्वयनों की बात करता है: मेजबान और फ्रीस्टैंडिंग। इस मामले में "कार्यान्वयन" का अर्थ है संकलक। होस्ट किए गए कंपाइलर एक विशिष्ट OS के लिए संकलन करते हैं और फ्रीस्टैंडिंग कंपाइलर्स एक विशिष्ट नंगे धातु के अनुप्रयोग के लिए संकलन करते हैं। आरटीओएस के मामले में भी एंबेडेड सिस्टम लगभग हमेशा फ्रीस्टैंडिंग सिस्टम हैं।

फ्रीस्टैंडिंग कार्यान्वयन किसी भी रूप के लिए उपयोग कर सकते हैं main(), उन्हें मुख्य रूप से फ़ंक्शन करने की आवश्यकता नहीं है। सबसे अधिक बार, वे फॉर्म का उपयोग करते हैं void main (void), क्योंकि यह कुछ भी वापस करने के लिए कोई मतलब नहीं है।

यहाँ महसूस करना महत्वपूर्ण है कि यह हमेशा संकलक है main()जो प्रोग्रामर के रूप को तय करता है और कभी नहीं।

फ्रीस्टैंडिंग कार्यान्वयन कि कर से लौटने के कुछ main()बहुत संदिग्ध है। आपको आश्चर्य होता है कि क्या संकलक बनाने वाले लोग वास्तव में मानक पढ़ते हैं ...

यहाँ विवरण


3

सी भाषा मानक कार्यान्वयन परिभाषित भिन्नता के लिए अनुमति देता है void main( void )और यह एम्बेडेड सिस्टम में सामान्य रूप है - केवल इसलिए कि उनके वापस लौटने की उम्मीद नहीं है।

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

यह भी (आमतौर पर) एक अनंत लूप के भीतर होगा, या शायद एक रीसेट करें, अगर main()रिटर्न


0

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

मुझे लगता है कि AVR-GCC पर सिमिलर है, इसलिए कस्टम स्क्रिप्ट मुख्य रिटर्न के बाद इस मूल्य का उपयोग कर सकती है।


बल्कि यह बात याद आती है
क्रिस स्ट्रैटन

यह इस बात पर जोर देता है कि जो कॉल करता है mainउसे इसका रिटर्न वैल्यू मिल सकता है। बेशक इसे ९९.९% स्थितियों में नजरअंदाज कर दिया गया है, लेकिन इसका जवाब यह जानकारी प्रदान करता है कि यह वापसी मूल्य कौन प्राप्त कर सकता है।
kwesolowski
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.