2011-02-06 15 views
6

सी के शुरुआती के रूप में, मैं फ़ाइल में फ़ंक्शन प्रोटोटाइप की आवश्यकता को समझ सकता हूं, लेकिन कुछ चीजों के बारे में अनिश्चित हूं।सी प्रोटोटाइप फ़ंक्शन

सबसे पहले, क्या मुख्य कार्य के बाहर प्रत्येक फ़ंक्शन कॉल प्रोटोटाइप घोषणा की आवश्यकता होती है? क्या ऐसी कोई स्थितियां हैं जहां यह बदल सकता है?

दूसरा, क्या आपको विधि ओवरलोड के लिए एक अलग फ़ंक्शन प्रोटोटाइप की आवश्यकता है?

उत्तर

8

सी में फ़ंक्शन कॉल को प्रोटोटाइप दिखाई देने की आवश्यकता नहीं है लेकिन इसकी अत्यधिक अनुशंसा की जाती है कि एक सही प्रोटोटाइप गुंजाइश में है।

इसका कारण यह है कि यदि फ़ंक्शन परिभाषा डिफ़ॉल्ट फ़ंक्शन तर्क प्रचार के बाद फ़ंक्शन तर्कों के प्रकार से मेल नहीं खाती है तो आपको अपरिभाषित व्यवहार प्राप्त होने की अत्यधिक संभावना होती है।

सही प्रोटोटाइप दृश्यमान होने का मतलब है कि संकलक फ़ंक्शन कॉल के तर्कों की जांच कर सकता है और प्रोग्रामर को चेतावनी देता है कि कोई मेल नहीं है।

सी कार्यों को अधिभारित करने की अनुमति नहीं देता है ताकि आपके पास किसी भी फ़ंक्शन नाम के लिए केवल एक प्रोटोटाइप हो।

डिफ़ॉल्ट तर्क प्रचार अप्रत्याशित विसंगतियों का कारण बन सकता है।

उदा।

int main(int argc, char **argv) 
{ 
    short s = 5; 
    float f = 2.3f; 
    x(s, f);  // x implicitly declared; default argument promotions performed 
    return 0; 
} 

int x(short t, float g) // Error: called with an int and a double 
{ 
    return (int)(t + g); 
} 

समारोह कॉल में, क्योंकि x नहीं दिखाई प्रोटोटाइप (अभी तक) है, sint और f करने के लिए प्रोत्साहित किया जाएगा double करने के लिए प्रोत्साहित किया जाएगा। ये डिफ़ॉल्ट तर्क प्रचार हैं। यह तो एक बेमेल जब समारोह एक प्रोटोटाइप है कि एक short और एक float लेता है, भले ही इन तर्कों कि में पारित किए गए के मूल प्रकार के होते हैं के साथ परिभाषित किया गया है कारण बनता है।

कार्य है कि बहस के परिवर्तनशील ले (यानी उपयोग , ... वाक्यविन्यास) उस बिंदु पर हमेशा एक दृश्य प्रोटोटाइप होना चाहिए जिस पर उन्हें बुलाया जाता है।

1

नहीं, प्रोटोटाइप होने के लिए कार्यों की आवश्यकता नहीं है। हालांकि, वे उपयोगी हैं क्योंकि वे घोषित होने से पहले कार्यों को बुलाए जाने की अनुमति देते हैं। उदाहरण के लिए:

int main(int argc, char **argv) 
{ 
    function_x(); // undefined function error 
    return 0; 
} 

void function_x() 
{ 

} 

आप main ऊपर एक प्रोटोटाइप (यह आमतौर पर एक हेडर फाइल में किया जाता है) यह, आप function_x फोन करने की अनुमति होगी, भले ही यह main के बाद निर्धारित किया है जोड़ें। यही कारण है कि जब आप एक बाहरी पुस्तकालय का उपयोग कर रहे हैं जिसे लिंक करने की आवश्यकता है, तो आप इसमें हेडर फ़ाइल को सभी फ़ंक्शन प्रोटोटाइप के साथ शामिल करते हैं।

सी में फ़ंक्शन ओवरलोडिंग नहीं है, इसलिए यह अप्रासंगिक है।

+2

जहां आपने टिप्पणी की है संकलन त्रुटि का कारण नहीं होगा। 'function_x(); 'निश्चित रूप से' function_x();' को एक इंटोटोटाइप फ़ंक्शन के रूप में 'int' लौटाएगा। यह एक त्रुटि है कि फ़ंक्शन को बाद में 'शून्य' लौटने के रूप में घोषित किया जाता है। –

0

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

उपरोक्त तर्क ओवरलोड पर भी लागू होता है।

बेशक, क्योंकि आप सी के लिए नए हैं।मुझे लगता है कि आप बेहतर समझने के लिए प्रोटोटाइप और एक फ़ंक्शन की परिभाषा के बीच अंतर को बेहतर तरीके से देखते हैं।

+0

ओह, सी अधिभार नहीं है! @ टिम कूपर के लिए धन्यवाद। – Outspoken

+0

यह सुनिश्चित करने के लिए एक अच्छा प्रोग्रामिंग अनुशासन है कि आपको संकलक विकल्प मिल जाए जो सुनिश्चित करता है कि सभी कार्यों का उपयोग करने से पहले पूर्ण प्रोटोटाइप के साथ घोषित किया गया हो, और यह सुनिश्चित करने के लिए कि आप हर समय कंपाइलर विकल्प का उपयोग करते हैं, और इसकी चेतावनियों पर ध्यान देते हैं। –

4

अन्य ने पहले ही बताया है कि सी कार्यों के लिए प्रोटोटाइप की आवश्यकता नहीं है। मैं बस कुछ मामूली अंक जोड़ दूंगा।

सभी की

सबसे पहले, एक प्रोटोटाइप के बिना, एक कार्य करने के लिए तर्क हमेशा पैरामीटर के रूप में पारित किया जा रहा है, तो (उदाहरण के लिए) सभी छोटे पूर्णांक प्रकार int करने के लिए प्रोत्साहित करने के पहले "डिफ़ॉल्ट प्रचार" से गुजरना है, और floatdouble के लिए प्रोत्साहित किया जाता है । इसलिए, प्रोटोटाइप के बिना, किसी फ़ंक्शन को प्राप्त करना असंभव है (उदाहरण के लिए) char, short, या float। यदि फ़ंक्शन है, तो उन प्रकारों में से किसी एक को प्राप्त करने के लिए परिभाषित किया गया है, जो बीत चुका है और कार्य क्या अपेक्षा करता है, के बीच कोई मेल नहीं होगा, अपरिभाषित व्यवहार (कोई अन्य मेल नहीं खाता अपरिभाषित व्यवहार भी देता है)।

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

संबंधित मुद्दे