क्या मुझे EXIT_SUCCESS या 0 को मुख्य () से वापस करना चाहिए?


124

यह एक आसान सवाल है, लेकिन मैं परस्पर विरोधी जवाब देख रहा हूं: क्या C ++ प्रोग्राम की वापसी की मुख्य दिनचर्या होनी चाहिए 0या EXIT_SUCCESS?

#include <cstdlib>
int main(){return EXIT_SUCCESS;}

या

int main(){return 0;}

क्या वे एक ही बात हैं? के EXIT_SUCCESSसाथ ही इस्तेमाल किया जाना चाहिए exit()?

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


क्या इससे आपके सवाल का जवाब मिलता है? stackoverflow.com/questions/1188335/…
ब्लास्टफ़र्नेस

2
C90 के बारे में यह उत्तर मानक को परिभाषित करता है - 0और EXIT_SUCCESSदोनों को सफलता के रूप में व्याख्यायित किया जाता है।
ta.speot.is

मैं यहाँ जवाब दूँगा क्योंकि मुझे लगता है कि भविष्य में कोई और इसे पढ़ रहा होगा। मूल रूप से "सही सी" जैसा दिखता है, पर कई प्रतिमान हैं। कुछ प्रतिमान मैक्रो पर शाब्दिक का उपयोग करना पसंद करते हैं, उदाहरण के लिए, NULL को एक तर्क के रूप में पारित करने के बजाय, वे (const char *) 0 पास करने के लिए संकेत कर सकते हैं कि यह सिर्फ एक अशक्त नहीं है, लेकिन अगर यह शून्य नहीं था, तो यह होना चाहिए निरंतर चरित्र सूचक। अन्य प्रतिमान प्रकार अज्ञेयवादी होना पसंद करते हैं और मैक्रो प्रकारों का उपयोग करके, जब चीजें बदल जाती हैं तो वे अपने कोडबेस को बदलने की आवश्यकता से बच सकते हैं। उदाहरण के लिए, कई -
दिमित्री

@Dmitry <जारी> नए प्लेटफार्मों में विंडोज एपीआई प्रकार की परिभाषाएं सही नहीं हैं, लेकिन चूंकि वे मैक्रोज़ थे, इसलिए उनके पास सभी प्रकारों को बदलने का आसान तरीका था जो मैक्रो को फिर से परिभाषित करके काम करते हैं, और इन प्रकारों में से अधिकांश को परिभाषा के अनुसार स्केल किया गया है (उदा। अलग-अलग प्लेटफार्मों पर इंट अलग है)। सारांशित करने के लिए, वापसी कोड मायने रखता है और भविष्य में बदल सकता है, तो EXIT_SUCCESS जैसी चीजों का उपयोग करें, अन्यथा 0 लौटाना एक जादुई संख्या की तरह लग सकता है लेकिन यह अभी भी पूरी तरह से वैध मानक सम्मेलन है। त्रुटि कोड ज्यादातर कार्यक्रमों के लिए एक से दूसरे में नंबर परिणामों को पाइप करने के लिए है, -
दिमित्री

@Dmitry <जारी> अपने प्रोग्राम को डिबग करने के लिए त्रुटि कोड का उपयोग करना थोड़े कमजोर है क्योंकि यह 0 देता है, यह बहुत ही बेकार जानकारी है सिवाय कुछ मामलों में जब प्रोग्राम में अनथक अनहेल्ड एरर होते हैं जो प्रोग्राम को चुपचाप तोड़ सकते हैं, और आपको ज़रूरत है यह जाँचने के लिए कि क्या यह सामान्य रूप से वापस आया (0) या एक मूक त्रुटि हुई। नंबर वापसी एक प्रोग्राम से दूसरे इनपुट के आधार पर 0..255 पाइपिंग के लिए अधिक उपयोगी है, अन्यथा इसके बारे में सोचने का कोई कारण नहीं है: या तो 0 वापस करें या एक पूर्वनिर्धारित मुख्य का उपयोग करें जो एक शून्य "इनिट" को नेत्रहीन रूप से कॉल नहीं करता है। आपको बेकार वापसी से परेशान करता है।
दिमित्री

जवाबों:


151

EXIT_FAILUREया तो एक रिटर्न स्टेटमेंट में mainया एक तर्क के रूप exit()में, C या C ++ प्रोग्राम में विफलता को इंगित करने का एकमात्र पोर्टेबल तरीका है। exit(1)उदाहरण के लिए, वास्तव में VMS पर सफल समाप्ति का संकेत दे सकता है।

यदि आप EXIT_FAILUREअपने प्रोग्राम के विफल होने पर उपयोग करने जा रहे हैं , तो हो सकता है कि आप इसका उपयोग EXIT_SUCCESSतब करें जब यह सफल हो, बस समरूपता के लिए।

दूसरी ओर, यदि प्रोग्राम कभी भी विफलता का संकेत नहीं देता है, तो आप 0या तो उपयोग कर सकते हैं या EXIT_SUCCESS। दोनों सफल मानक को पूरा करने के लिए मानक द्वारा गारंटीकृत हैं। (यह मुश्किल से संभव है कि EXIT_SUCCESSएक मान 0 के अलावा हो सकता है, लेकिन यह मेरे द्वारा कभी भी सुना गया हर कार्यान्वयन पर 0 के बराबर है।)

उपयोग करने 0का मामूली फायदा है कि आपको #include <stdlib.h>C, या #include <cstdlib>C ++ में ज़रूरत नहीं है (यदि आप a का उपयोग कर रहे हैंreturn कॉल करने के बजाय स्टेटमेंटexit() ) - लेकिन किसी भी महत्वपूर्ण आकार के प्रोग्राम के लिए आप सीधे या अप्रत्यक्ष रूप से stdlib को शामिल करने जा रहे हैं वैसे भी।

उस मामले के लिए, सी में 1999 मानक के साथ शुरू, और सी ++ के सभी संस्करणों में, वैसे भी main()एक निहितार्थ के अंत तक पहुंच जाता return 0;है, इसलिए आपको 0या तो EXIT_SUCCESSस्पष्ट रूप से उपयोग करने की आवश्यकता नहीं हो सकती है । (लेकिन कम से कम सी में, मैं एक स्पष्ट विचार करता हूंreturn 0; शैली को बेहतर शैली ।)

(किसी ने ओपन VMS के बारे में पूछा। मैं एक लंबे समय में उपयोग नहीं किया है, लेकिन जैसा कि मैं आम तौर पर निरूपित सफलता अजीब स्थिति मानों को याद करते हुए भी मान विफलता को दर्शाते हैं। सी कार्यान्वयन के नक्शे 0के लिए 1है, ताकि return 0;सफल समापन इंगित करता है। अन्य मान अपरिवर्तित पारित कर रहे हैं , इसलिए return 1;सफल समाप्ति को भी इंगित करता है। EXIT_FAILUREएक गैर-शून्य भी मान होगा।)


@KeithThompson क्या आप VMS (OpenVMS?) के संबंध में अपना जवाब स्पष्ट कर सकते हैं। यह 0 और 1 के साथ EXIT_SUCCESS / EXIT_FAILURE के संबंध स्पष्ट नहीं है। मैं इसके बजाय विषम / सम मूल्य की व्याख्या करूंगा।
मलोट

@ ललाट: क्या आप वास्तव में वीएमएस का उपयोग करते हैं?
कीथ थॉम्पसन

नहीं, कभी इसका इस्तेमाल नहीं किया। मैं एक विवादास्पद जवाब देख रहा था, क्योंकि विकिपीडिया ने एक अलग शब्द का उपयोग किया था ।
मलोट

1
@ राइमॉइड: यह C द्वारा निर्दिष्ट किया गया है, POSIX द्वारा नहीं।
कीथ थॉम्पसन

1
@DeanP: 0और EXIT_SUCCESSएक ही मान होने की गारंटी नहीं है (मैंने अपने उत्तर में उल्लेख किया है), लेकिन वे दोनों सफल समाप्ति को दर्शाते हैं। यदि आप भी उपयोग कर रहे हैं तोEXIT_SUCCESS स्टाइलिस्टी बेहतर है , लेकिन ठीक है। EXIT_FAILUREexit(0)
कीथ थॉम्पसन

25

यह मायने नहीं रखता। दोनों एक ही हैं।

C ++ मानक उद्धरण:

यदि स्थिति का मान शून्य या EXIT_SUCCESS है, तो स्थिति के सफल समापन का कार्यान्वयन-परिभाषित रूप वापस आ जाता है।


12
यह संकलक के लिए कोई फर्क नहीं पड़ता है, लेकिन यह स्टाइल के मामले के रूप में हो सकता है।
celtschk

2
@celtschk: शैली का द्रव्यमान धारणा आधारित उर्फ ​​गैर मानकीकृत है, ताकि अंतर के रूप में गिनती न हो। आप केवल सेब की तुलना सेब के साथ कर सकते हैं, सेब नाशपाती के साथ नहीं।
आलोक सेव

3
इसकी कोई गारंटी नहीं है EXIT_SUCCESS == 0। दूसरी ओर, इसके न होने का कोई अच्छा कारण नहीं है।
कीथ थॉम्पसन

@KeithThompson: EXIT_SUCCESS == 0. कोई गारंटी क्यों नहीं है? कृपया इसे और अधिक स्पष्ट रूप से समझाएं।
विध्वंसक

2
@PravasiMeet: सिस्टम में एक से अधिक मान हो सकते हैं जो सफलता को इंगित करता है।
कीथ थॉम्पसन

11

0, परिभाषा के अनुसार, एक जादुई संख्या है। EXIT_SUCCESS लगभग सार्वभौमिक रूप से 0 के बराबर है, खुशी से पर्याप्त है। तो क्यों न केवल वापसी / बाहर निकलें 0?

निकास (EXIT_SUCCESS); अर्थ में बहुतायत से स्पष्ट है।

बाहर निकलने के (0); दूसरी ओर, कुछ मायनों में प्रतिवाद है। शेल व्यवहार से परिचित नहीं कोई व्यक्ति मान सकता है कि 0 == असत्य == बुरा है, सी। में हर दूसरे उपयोग की तरह। लेकिन नहीं - इस एक विशेष मामले में, 0 == सफलता == अच्छा है। अधिकांश अनुभवी देवों के लिए, कोई समस्या नहीं है। लेकिन बिल्कुल बिना किसी कारण के लिए नए आदमी को यात्रा क्यों?

tl; dr - अगर आपके मैजिक नंबर के लिए कोई परिभाषित स्थिरांक है, तो लगभग कभी भी ऐसा कारण नहीं है कि पहली बार में स्थिरांक का उपयोग न किया जाए। यह अधिक खोज योग्य है, अक्सर स्पष्ट है, आदि और यह आपको कुछ भी खर्च नहीं करता है।


मुझे लगता है कि 0 से उम्मीद कर रहे लोगों के बारे में आपकी टिप्पणी स्वचालित रूप से खराब है। बहुत से API सफलता के लिए 0 का उपयोग करते हैं, और विफलता के लिए गैर-0, यहां तक ​​कि stdlib में भी। उदाहरण के लिए stdlib ( fclose(), setvbuf(), ...), POSIX ( listen(), pthread_create(), pipe(), ...), और कई, कई अन्य पुस्तकालयों (जैसे ओपन [ glGetError()], zlib [ deflate()/ inflate()/ ...], एसडीएल [ SDL_CreateWindowAndRenderer()/ ...], और अधिक)।
टिम Timस

2
निश्चित रूप से, ऐसे अन्य उदाहरण हैं जहां 0 का उपयोग 'सफलता' के लिए किया जाता है, लेकिन वह इसके बारे में सही है कि यह भ्रमित हो रहा है।
पॉल विन्टज़

10

यह एक कभी न खत्म होने वाली कहानी है जो "अंतर और सभी पर पोर्टेबिलिटी" की सीमाओं (एक मिथक) को दर्शाती है।

"सफलता" को इंगित करने के लिए कार्यक्रम को क्या लौटना चाहिए, यह परिभाषित किया जाना चाहिए कि कौन भाषा विनिर्देश द्वारा मान (ऑपरेटिंग सिस्टम, या प्रोग्राम को लागू करने वाली प्रक्रिया) प्राप्त कर रहा है।

लेकिन प्रोग्रामर "पोर्टेबल तरीके" में कोड लिखना पसंद करते हैं और इसलिए वे "ऑपरेटिंग सिस्टम" की अवधारणा के लिए अपने स्वयं के मॉडल का आविष्कार करते हैं ताकि लौटने के लिए प्रतीकात्मक मूल्यों को परिभाषित किया जा सके।

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

लेकिन - दुर्भाग्यपूर्ण रूप से - ये अवधारणा जहां उस समय स्पष्ट नहीं थी, जब सी भाषा को तैनात किया गया था (मुख्य रूप से UNIX कर्नेल लिखने के लिए), और पुस्तकों की गिगाग्राम जहां "रिटर्न 0 का मतलब सफलता" कहकर लिखा गया था, क्योंकि यह ओएस पर सच था। उस समय एक सी संकलक है।

तब से, इस तरह के पत्राचार को कैसे संभाला जाना चाहिए, इस पर कोई स्पष्ट मानकीकरण कभी नहीं किया गया था। C और C ++ की "वापसी मान" की अपनी परिभाषा है, लेकिन कोई भी एक उचित ओएस अनुवाद (या बेहतर: कोई संकलक प्रलेखन इसके बारे में कुछ भी नहीं कहता है) प्रदान करता है। 0 का मतलब है कि सफलता अगर UNIX के लिए सही है - LINUX और -for स्वतंत्र कारणों के लिए- साथ ही विंडोज के लिए, और यह मौजूदा "उपभोक्ता कंप्यूटर" का 90% कवर करता है, जो कि - अधिकांश मामलों में - वापसी मूल्य की उपेक्षा करता है (इसलिए हम कर सकते हैं दशकों के लिए चर्चा करें, बू कोई भी कभी नोटिस करेगा! "

इस परिदृश्य के अंदर, निर्णय लेने से पहले, इन प्रश्नों को पूछें: - क्या मुझे अपने मौजूदा के बारे में अपने कॉलर को कुछ बताने के लिए दिलचस्पी है? (यदि मैं हमेशा 0 लौटाता हूं ... सभी चीजों के पीछे कोई सुराग नहीं है) - क्या मेरे कॉलर के पास इस संचार के बारे में कन्वेंशन हैं? (ध्यान दें कि एक एकल मान एक कन्वेंशन नहीं है: जो किसी भी सूचना प्रतिनिधित्व की अनुमति नहीं देता है)

यदि यह दोनों उत्तर नहीं हैं, तो संभवत: अच्छा समाधान मुख्य रिटर्न स्टेटमेंट को बिल्कुल भी नहीं लिखता है। (और संकलक तय करने के लिए लक्ष्य के संबंध में काम करने दें)।

यदि कोई कन्वेंशन 0 में नहीं है, तो सफलता अधिकतर स्थितियों से मिलती है (और यदि वे किसी कन्वेंशन का परिचय देते हैं तो प्रतीकों का उपयोग समस्याग्रस्त हो सकता है)।

यदि कन्वेंशन जगह में हैं, तो प्रतीकात्मक स्थिरांक का उपयोग करना सुनिश्चित करें जो उनके साथ सुसंगत हैं (और प्लेटफ़ॉर्म के बीच, कॉन्वेंट सुसंगतता सुनिश्चित करें, न कि सुसंगतता सुनिश्चित करें)।


4

एक बार जब आप कोड लिखना शुरू कर देते हैं जो कि बाहर निकलने की स्थिति में असंख्य लौट सकते हैं, तो आप #defineउन सभी को शुरू करते हैं। इस मामले EXIT_SUCCESSमें " जादू की संख्या " नहीं होने के संदर्भ में समझ में आता है । यह आपके कोड को अधिक पठनीय बनाता है क्योंकि प्रत्येक अन्य निकास कोड होगा EXIT_SOMETHING। यदि आप बस एक प्रोग्राम लिखते हैं जो कि यह पूरा होने पर वापस आ जाएगा, return 0तो वैध है, और शायद क्लीनर भी क्योंकि यह बताता है कि कोई परिष्कृत रिटर्न कोड संरचना नहीं है।


0

एक कार्यक्रम से आप जो वापसी करते हैं वह सिर्फ एक सम्मेलन है।

नहीं, मैं किसी भी परिस्थिति के बारे में नहीं सोच सकता जहाँ "EXIT_SUCCESS" "0" नहीं होगा

व्यक्तिगत रूप से, मैं "0" की सिफारिश करूंगा।

IMHO...


1
मैं 10 वर्षों से C ++ प्रोग्रामिंग कर रहा हूं और अभी भी याद नहीं कर सकता कि 0 का मतलब रिटर्न वैल्यू के मामले में सफलता या विफलता है।
lahjaton_j

@ अल्लाहजतन_ज मुझे समझ में आया। यह लगता है कि यह क्योंकि यह काउंटर सहज है: 0गलत है, और कई कार्य 0विफलता / कुछ भी नहीं करने पर लौटते हैं ।
अर्थ-मामलों

-4

यदि आप EXIT_SUCCESS का उपयोग करते हैं, तो आपका कोड अधिक पोर्टेबल होगा।

http://www.dreamincode.net/forums/topic/57495-return-0-vs-return-exit-success/


5
मुझे बहुत संदेह है कि यह आपके कोड को अधिक या किसी भी कम पोर्टेबल बनाता है।
बेंजामिन लिंडले

9
नहीं, यह नहीं होगा। मानक गारंटी देता है कि 0 और EXIT_SUCCESSदोनों सफल समाप्ति को दर्शाते हैं।
कीथ थॉम्पसन

-5

कुछ कंपाइलर इसके साथ समस्याएँ पैदा कर सकते हैं - एक मैक C ++ कंपाइलर पर, EXIT_SUCCESS ने मेरे लिए ठीक काम किया, लेकिन लिनक्स C ++ कंपलेंट पर मुझे इसके लिए cstdlib जोड़ना पड़ा, यह जानने के लिए कि EXIT_SUCCESS क्या है। इसके अलावा, वे एक और एक ही हैं।


मेरा मतलब था कि MAC EXIT_SUCCESS ने cstdlib को शामिल किए बिना काम किया।
राजदूत

4
यदि या EXIT_SUCCESSतो शामिल किए बिना काम किया जाता है, तो कुछ अन्य हेडर ने इसे प्रत्यक्ष या अप्रत्यक्ष रूप से परिभाषित किया होगा। C ++ में, यह मानक हेडर से अन्य मानक हेडर के लिए सामान्य है । यदि यह त्रुटि के बिना संकलित होता है: तो आपका संकलक संभवतः छोटी गाड़ी है। <stdlib.h><cstdlib>#includeint main() { return EXIT_SUCCESS; }
कीथ थॉम्पसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.