C Language
घोषणा बनाम परिभाषा
खोज…
टिप्पणियों
स्रोत: एक परिभाषा और एक घोषणा के बीच क्या अंतर है?
स्रोत (कमजोर और मजबूत प्रतीकों के लिए): https://www.amazon.com/Computer-Systems-Programmers-Perspective-2nd/dp/0136108040/
घोषणा और परिभाषा को समझना
एक घोषणा एक पहचानकर्ता का परिचय देती है और उसके प्रकार का वर्णन करती है, यह एक प्रकार, वस्तु या कार्य है। एक घोषणा है कि संकलक को उस पहचानकर्ता के संदर्भों को स्वीकार करने की आवश्यकता है। ये घोषणाएँ हैं:
extern int bar;
extern int g(int, int);
double f(int, double); /* extern can be omitted for function declarations */
double h1(); /* declaration without prototype */
double h2(); /* ditto */
एक परिभाषा वास्तव में इस पहचानकर्ता को तत्काल / लागू करती है। यह उन संस्थाओं के संदर्भ को जोड़ने के लिए लिंकर की जरूरत है। ये उपरोक्त घोषणाओं के अनुरूप परिभाषाएँ हैं:
int bar;
int g(int lhs, int rhs) {return lhs*rhs;}
double f(int i, double d) {return i+d;}
double h1(int a, int b) {return -1.5;}
double h2() {} /* prototype is implied in definition, same as double h2(void) */
एक घोषणा के स्थान पर एक परिभाषा का उपयोग किया जा सकता है।
हालाँकि, इसे ठीक एक बार परिभाषित किया जाना चाहिए। यदि आप किसी ऐसी चीज़ को परिभाषित करना भूल जाते हैं जिसे घोषित किया गया है और कहीं संदर्भित किया गया है, तो लिंक करने वाले को यह नहीं पता होता है कि एक लापता प्रतीकों के बारे में किससे संदर्भ जोड़ा जाए और शिकायत की जाए। यदि आप एक से अधिक बार कुछ परिभाषित करते हैं, तो लिंकर को यह नहीं पता होता है कि किन संदर्भों को लिंक करना है और डुप्लिकेट प्रतीकों के बारे में शिकायत करता है।
अपवाद:
extern int i = 0; /* defines i */
extern int j; /* declares j */
इस अपवाद को "मजबूत प्रतीकों बनाम कमजोर प्रतीकों" की अवधारणाओं का उपयोग करके समझाया जा सकता है (एक लिंकर के दृष्टिकोण से)। अधिक स्पष्टीकरण के लिए कृपया यहां (स्लाइड 22) देखें।
/* All are definitions. */
struct S { int a; int b; }; /* defines S */
struct X { /* defines X */
int x; /* defines non-static data member x */
};
struct X anX; /* defines anX */