सी 99 मानक (5.1.2.2.1 कार्यक्रम स्टार्टअप) का कहना है एक कार्यान्वयन मुख्य() फ़ंक्शन के लिए लागू करता है कोई प्रोटोटाइप कि, और एक कार्यक्रम में से किसी के रूप में यह निर्धारित कर सकते हैं कि:
1) int मुख्य (शून्य);
2) int मुख्य (int argc, char * argv []);
या अर्थात् 2 के बराबर समान रूप से), उदाहरण के लिए
2 ') int मुख्य (int argc, char ** argv);
या अन्य कार्यान्वयन परिभाषित तरीकों में। यह जनादेश है कि प्रोटोटाइप:
3) int मुख्य (int argc, char * argv [], char * envp []);
का इरादा व्यवहार होगा - हालांकि प्रोटोटाइप को संकलित करना होगा, क्योंकि किसी भी प्रोटोटाइप को संकलित करना होगा। 3) अन्य कंपेलरों के बीच जीसीसी और माइक्रोसॉफ्ट सी द्वारा समर्थित है। (एनबी। प्रश्नकर्ता का तीसरा प्रोटोटाइप char * envp [] के बजाय char * envp है, चाहे दुर्घटना हो या क्योंकि उसके पास कुछ अन्य कंपाइलर है)।
दोनों जीसीसी और माइक्रोसॉफ्ट सी मुख्य() को किसी भी प्रोटोटाइप के साथ संकलित करेंगे, जैसा कि उन्हें करना चाहिए। वे प्रोटोटाइप को पार्स करते हैं जिसे आप वास्तव में निर्दिष्ट करते हैं और सही तरीके से तर्कों का उपभोग करने के लिए असेंबली भाषा उत्पन्न करते हैं। इस प्रकार, उदाहरण के लिए वे प्रत्येक कार्यक्रम के लिए अपेक्षित व्यवहार उत्पन्न करेगा:
#include <stdio.h>
void main(double d, char c)
{
printf("%lf\n",d);
putchar(c);
}
यदि आप एक डबल पास करने का तरीका और इस कार्यक्रम के लिए एक चार सीधे मिल सकता है तार की एक सरणी के माध्यम से नहीं।
इन अवलोकनों को प्रयोगात्मक कार्यक्रमों के लिए असेंबली भाषा सूची सक्षम करके सत्यापित किया जा सकता है।
कैसे संकलक के मानक CRT हमें परमिट) मुख्य के उत्पन्न कार्यान्वयन (आह्वान करने के लिए का सवाल कैसे main() संकलक को परिभाषित किया जा सकता का सवाल से अलग है।
दोनों जीसीसी और एमएस सी के लिए, मुख्य() किसी भी तरह से परिभाषित किया जा सकता है। प्रत्येक मामले में हालांकि कार्यान्वयन के मानक सीआरटी, एएफआईके, मुख्य() के अनुसार तर्कों को उत्तीर्ण करने का समर्थन करता है 3)। तो 1) - 2 ') में अतिरिक्त तर्कों को अनदेखा करके अपेक्षित व्यवहार भी होगा, और हमारे पास गैर-मानक रनटाइम प्रदान करने के अलावा कोई अन्य विकल्प नहीं है।
हंस पासेंट का जवाब आकस्मिक रूप से भ्रामक लगता है कि argc फ़ंक्शन को बताता है कि कितने बाद के तर्क printf() के पहले तर्क के रूप में उपभोग करते हैं। यदि argc बिल्कुल मौजूद है, तो यह केवल दूसरे तर्क argv के रूप में पारित सरणी में तत्वों की संख्या को दर्शाता है। यह इंगित नहीं करता है कि मुख्य() में कितने तर्क पारित किए जाते हैं। दोनों जीसीसी और एमएस सी आंकड़ा बाहर कैसे क्या तर्क प्रोटोटाइप आपके द्वारा लिखा गया पार्स करने से उम्मीद कर रहे हैं - अनिवार्य रूप से क्या एक संकलक उन को छोड़कर किसी भी समारोह के साथ करता है, printf की तरह(), कि परिभाषित कर रहे हैं तर्क के परिवर्तनशील लेने के लिए।
मुख्य() तर्कों की एक चर संख्या नहीं लेता है।यह आपके परिभाषा में निर्दिष्ट तर्क लेता है, और सामान्य कंपेलरों के मानक सीआरटी उन्हें मानते हैं (int, char * [], char * [])।
यह शायद 32 बिट विंडोज सी रनटाइम सटीक है। लेकिन अन्य प्लेटफार्मों के बारे में क्या है जहां एबीआई अलग है? उदाहरण के लिए x64 जहां सीडीसीएल के लिए भी रजिस्टरों में पैरामीटर पास किए जाते हैं। और इस 'int मुख्य (डबल डी)' की तरह घोषित 'मुख्य' फ़ंक्शन के अनुरूप क्या है? और मानक में यह कहता है कि सभी 'मुख्य' कार्यों को '__cdecl' का उपयोग करना चाहिए जो मानक का हिस्सा भी नहीं है? और 'विनमेन' के बारे में क्या? –
ठीक है, कम से कम आपके उत्तर की पहली वाक्य अब सटीक है। ;-) –
खट्टा अंगूर डेविड? आपका उत्तर सही हो सकता है, मैं बस ऐसे किसी भी कंपाइलर को नहीं जानता जो प्रतिबिंब के प्रकार का समर्थन करता है जिसे इसे काम करने के लिए आवश्यक होगा। मैं केवल उन में से 8 में उपयोग किए गए प्रस्तावों की पेशकश कर सकता हूं जिनके बारे में मैंने काफी करीब अध्ययन किया था, वे सभी एक सीडीईसी कॉलिंग सम्मेलन का इस्तेमाल करते थे। शायद क्योंकि यह लागू करना बहुत आसान है, हालांकि कोड उत्पन्न करने में इतना आसान नहीं है। प्रतिबिंब सी में एक बहुत ही असामान्य विशेषता है। आप शायद ऐसे कंपाइलर का उदाहरण देकर इसे और अधिक समझदार बना सकते हैं? –