स्टैंडर्ड सी - होस्टेड पर्यावरण
एक होस्ट किए गए वातावरण के लिए (यह सामान्य है), 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 मानक में (ऊपर उद्धृत), के अलावा एक फुटनोट से (जो केवल दस्तावेज़ों को और परिभाषित कर रहे हैं में )।exit
EXIT_SUCCESS
EXIT_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;
}