क्या भी दिलचस्प है एक प्रोटोटाइप के बिना साथ काम करता है, और कार्यों का बुला सम्मेलन का अंतर है। एक पुरानी शैली परिभाषा पर विचार करें:
void f(a)
float a; {
/* ... */
}
इस मामले में, बुला परंपरा है कि सभी तर्क कार्य करने के लिए पारित किया जा रहा से पहले पदोन्नत कर रहे हैं। तो अगर f
एक double
प्राप्त करता है लेकिन पैरामीटर टाइप float
है (जो पूरी तरह से वैध है) संकलक कोड है कि एक नाव के लिए डबल धर्मान्तरित समारोह के शरीर को क्रियान्वित करने से पहले फेंकना है।
यदि आप प्रोटोटाइप शामिल करते हैं, तो संकलक अब ऐसे स्वचालित प्रचार नहीं करता है और किसी भी डेटा को प्रोटोटाइप के पैरामीटर के प्रकारों में परिवर्तित किया जाता है जैसे असाइनमेंट द्वारा।तो निम्नलिखित कानूनी नहीं है और अपरिभाषित व्यवहार में परिणाम:
void f(float a);
void f(a)
float a; {
}
इस मामले में, समारोह की परिभाषा float
को double
से प्रस्तुत पैरामीटर (पदोन्नत फार्म) में बदल सकते हैं क्योंकि परिभाषा पुरानी शैली है। लेकिन पैरामीटर को फ्लोट के रूप में सबमिट किया गया था, क्योंकि फ़ंक्शन में प्रोटोटाइप होता है। विरोधाभासों के हल के लिए अपने विकल्पों दो निम्नलिखित हैं: यदि आप पसंद है क्योंकि यह सामने पुरानी शैली परिभाषा से मुक्त हो जाता है
// option 1
void f(double a);
void f(a)
float a; {
}
// option 2
// this declaration can be put in a header, but is redundant in this case,
// since the definition exposes a prototype already if both appear in a
// translation unit prior to the call.
void f(float a);
void f(float a) {
}
विकल्प 2 प्राथमिकता दी जानी चाहिए। यदि एक फ़ंक्शन के लिए फ़ंक्शन प्रकारों के विपरीत विरोधाभासी प्रकार एक ही अनुवाद इकाई में प्रकट होते हैं, तो संकलक आमतौर पर आपको बताएगा (लेकिन आवश्यक नहीं है)। यदि इस तरह के विरोधाभास एकाधिक अनुवाद इकाइयों पर दिखाई देते हैं, तो त्रुटि संभवतः अनजान हो जाएगी और परिणामस्वरूप बग की भविष्यवाणी करना मुश्किल हो सकता है। इन पुराने शैली परिभाषाओं से बचने के लिए सबसे अच्छा है।
स्रोत
2009-10-18 17:24:34
सी 8 9/9 0 और सी 99 दोनों अभी भी आधिकारिक तौर पर के एंड आर शैली घोषणाओं का समर्थन करते हैं। हालांकि, सी 99 में सभी मानकों को स्पष्ट रूप से घोषित किया जाना चाहिए (अब "अंतर्निहित int" नियम नहीं है)। – AnT
मुझे पार्टी के देर से होने से नफरत है (जैसे 4 साल बाद?), लेकिन क्या आपको यह कहना है कि सी 99 में उन्हें पैरामीटर सूची * या * में * * में स्पष्ट रूप से घोषित किया जाना चाहिए? उदाहरण के लिए, डिफ़ॉल्ट int नियम - चूंकि वे अब int के लिए डिफ़ॉल्ट नहीं हैं, तो उपयोग के पहले उनके प्रकार को फ़ंक्शन में घोषित करने की आवश्यकता है ** यदि ** पैरामीटर सूची में प्रकारों की आपूर्ति नहीं की गई थी? –
@ChrisCirefice 4 साल बाद आपको जवाब देने के लिए: सी 99 में, पैरामीटर सूची में सभी पैरामीटर घोषित किए जाने चाहिए। फ़ंक्शन में घोषित वेरिएबल्स को कभी भी 'int' में डिफॉल्ट नहीं किया गया है, और इस प्रकार स्पष्ट रूप से घोषित किया जाना चाहिए। –