क्या निकास () कुछ विशेष करता है जो 'वापसी' नहीं करता है?
असामान्य प्लेटफार्मों के लिए कुछ संकलक के साथ, exit()
अपने तर्क को अपने कार्यक्रम के निकास मूल्य में अनुवाद कर सकते हैं , जबकि वापसी से main()
केवल बिना किसी अनुवाद के सीधे मेजबान वातावरण में मान पारित कर सकते हैं।
मानक को इन मामलों में समान व्यवहार की आवश्यकता होती है (विशेष रूप से, यह कहता है कि कुछ-जो कि- int
असंगत है उस मान के साथ main()
कॉल करने के बराबर होना चाहिए exit()
)। समस्या यह है कि विभिन्न ओएस में निकास मूल्यों की व्याख्या करने के लिए अलग-अलग परंपराएं हैं। कई (MANY!) सिस्टम पर, 0 का मतलब सफलता है और कुछ भी विफलता है। लेकिन, कहने पर, VMS, विषम मानों का अर्थ है सफलता और यहां तक कि असफलताओं का अर्थ है। यदि आप 0 से लौटे हैं main()
, तो VMS उपयोगकर्ता को एक्सेस उल्लंघन के बारे में एक बुरा संदेश दिखाई देगा। वास्तव में एक एक्सेस उल्लंघन नहीं था - यह केवल मानक संदेश विफलता कोड 0 से जुड़ा था।
तब एएनएसआई ने साथ आकर आशीर्वाद दिया EXIT_SUCCESS
और उन EXIT_FAILURE
तर्कों के रूप में जिन्हें आप पारित कर सकते हैं exit()
। मानक यह भी कहता है कि exit(0)
पहचान के लिए व्यवहार करना चाहिए exit(EXIT_SUCCESS)
, इसलिए अधिकांश कार्यान्वयन परिभाषित EXIT_SUCCESS
करते हैं 0
।
इसलिए, मानक आपको VMS पर एक बाध्यता में रखता है, क्योंकि यह मान 0 होने के लिए विफलता कोड को वापस करने के लिए कोई मानक तरीका नहीं छोड़ता है ।
1990 के दशक के शुरुआती दौर के वैक्स / वीएमएस सी कंपाइलर ने रिटर्न वैल्यू की व्याख्या नहीं की थी main()
, इसने मेजबान वातावरण के लिए जो भी मूल्य था वापस कर दिया। लेकिन अगर आपने इसका उपयोग किया exit()
है तो मानक के लिए क्या करना होगा: अनुवाद EXIT_SUCCESS
(या 0
) सफलता कोड में और EXIT_FAILURE
सामान्य विफलता कोड में। उपयोग करने के लिए EXIT_SUCCESS
, आप के लिए किया था इसे पारित करने के लिए exit()
, आप से इसे वापस नहीं कर सकता है main()
। मुझे नहीं पता कि उस संकलक के अधिक आधुनिक संस्करणों ने उस व्यवहार को संरक्षित किया है या नहीं।
एक पोर्टेबल सी प्रोग्राम इस तरह दिखता था:
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Hello, World!\n");
exit(EXIT_SUCCESS); /* to get good return value to OS */
/*NOTREACHED*/ /* to silence lint warning */
return 0; /* to silence compiler warning */
}
एक तरफ: यदि मुझे सही ढंग से याद है, तो बाहर निकलने के मूल्यों के लिए VMS सम्मेलन विषम / से भी अधिक बारीक है। यह वास्तव में एक गंभीर स्तर को सांकेतिक शब्दों में बदलना करने के लिए कम तीन बिट्स की तरह कुछ का उपयोग करता है। आम तौर पर, हालांकि, विषम गंभीरता के स्तर ने सफलता या विविध जानकारी और यहां तक कि त्रुटियों को इंगित किया।