2011-12-13 16 views
12

सी प्रोग्रामिंग भाषा का उपयोग करते समय इन शर्तों को अनिवार्य रूप से समानार्थी माना जाता है। अभ्यास में मैं हेडर फ़ाइल के माध्यम से शामिल प्रोटोटाइप के लिए "फ़ंक्शन प्रोटोटाइप" बनाम इन-फ़ाइल प्रोटोटाइप के लिए "आगे की घोषणा" पसंद कर सकता हूं। लेकिन यह भी एक कृत्रिम भेद है जब आप विचार करते हैं कि प्रीप्रोकैसिंग के बाद क्या होता है। शायद मुझे कुछ याद आ रही है।शब्दावली: फॉरवर्ड घोषणा बनाम फ़ंक्शन प्रोटोटाइप

क्या एक शब्द बनाम दूसरे शब्द का उपयोग करने के लिए सर्वसम्मति है?

उत्तर

6

आईएमओ वे वास्तव में समानार्थी नहीं हैं। मेरे लिए "फ़ंक्शन प्रोटोटाइप" फ़ंक्शन नाम और उसके पैरामीटर और रिटर्न के प्रकारों का संदर्भ लें। यह न केवल "आगे की घोषणा" कहने पर लागू होता है। सभी कार्यों में प्रोटोटाइप होता है।

हम अधिक बार एक समारोह घोषणा एवं इससे संबंधित परिभाषा के बीच एक अंतर बना।

+1

+1, हालांकि यह घोषणा का उल्लेख करने के शब्द "प्रोटोटाइप" का उपयोग करने के वास्तव में आम है । –

+0

मुझे लगता है कि आप और @MatteoItalia ने इसे सारांशित किया है। जब मैं घोषणा शब्द का उपयोग कर रहा हूं तो मैं प्रोटोटाइप शब्द का उपयोग कर रहा हूं। –

4

मैं परिभाषा के साथ निम्नलिखित प्रकार के struct घोषणा के लिए आगे की घोषणा का उपयोग करता हूं।

struct Foo; 

एक समारोह घोषणा एक पूर्ण प्रोटोटाइप, पूर्व -1989 साथ संगतता के लिए होने की जरूरत नहीं (K & आर) सी

char *foo(); // NOT the same as char *foo(void) 
0

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

-1

अगर वहाँ एक आम सहमति नहीं है मैं नहीं जानता, लेकिन मैं स्पष्ट तरीका यह होगा करने के लिए लगता है:

  • प्लेस हेडर फाइल में सभी घोषणाओं, स्रोत या ग फ़ाइलों में कभी नहीं। (मुझे लगता है कि आप घोषणा मतलब जब आप कहते हैं आगे घोषणा।)
  • प्लेस स्रोत फ़ाइलों में सभी परिभाषाओं

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

int foo(char *str_one, char *str_two, char *str_three); 

है और ईसा पूर्व चेतावनी और न ही त्रुटियों

int foo(char *str_one, char *str_two); 

आप नहीं मिलेगा है, और b.c से foo() में किए गए कॉल उस स्टैक पर सभी पैरामीटर नहीं रखेंगे जहां वे होना चाहिए, जिसका अर्थ है कि foo() केवल स्टैक से कुछ ले जाएगा और इसे स्ट्र_थ्री के रूप में पेश करेगा, संभवतः एक सेगफॉल्ट की ओर अग्रसर होगा। तो मेरे लिए, घोषणाएं हेडर फाइलों पर जाती हैं और परिभाषाएं स्रोत फ़ाइलों पर जाती हैं।

+2

'स्थैतिक' कार्यों के लिए घोषणा सी फाइल में डाली जानी चाहिए जिसे वे इम्हो में परिभाषित किया गया है, अधिमानतः शुरुआत में। –

+0

@tristopia - अच्छा बिंदु, जब मैं अपने साबुन बॉक्स पर गया तो मैं स्थिर कार्यों के बारे में सोच नहीं रहा था। मैं निश्चित रूप से उन शीर्ष लेख फ़ाइल में घोषित नहीं करता। – dbeer

6

शब्द "प्रोटोटाइप" एक विशिष्ट घोषणा वाक्यविन्यास को संदर्भित करता है; विशेष रूप से, कि समारोह में पैरामीटर की संख्या और प्रकार घोषणा में प्रकट होते हैं।यह देखते हुए एक समारोह परिभाषा

int foo(int a, char *b) {...} 

की आप निम्नलिखित घोषणाओं से कोई भी कर सकते हैं:

int foo();    // a declaration, but not a prototype 
int foo(a, b);   // a declaration, but not a prototype 
int foo(int, char *);  // a declaration and a prototype 
int foo(int a, char *b); // a declaration and a prototype 
+0

आपका विकल्प 'int foo (a, b);' केवल तभी वैध है जब 'ए' और' बी' ज्ञात प्रकार के नाम हैं, या यदि उसके बाद फ़ंक्शन बॉडी '{...} 'अर्धविराम के बजाय होता है। –

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