एक परिभाषा हमेशा एक घोषणा है। अंतर यह है कि एक परिभाषा जो भी आप कुछ मूल्य घोषित करती है उसे भी देती है।
f(int a, /* Defines a */
int b)
{
int a; /* Declares a - error! */
a=20; /* initializes a */
return a;
}
आप शायद ऐसा करने का मतलब:
अपने उदाहरण में, वैसे, यह केवल एक पुन: घोषणा त्रुटि है
f(int a, /* Defines a */
int b)
{
int a = 20; /* Declares and defines a - error! */
return a;
}
लेकिन इस मामले में, सबसे compilers होगा एक "redeclaration" त्रुटि भी फेंक दें।
Error: 'a' redeclared as a different kind of symbol
है ऐसा इसलिए है क्योंकि a
मूल रूप से एक पैरामीटर है, जो समारोह की गुंजाइश के अंदर एक चर परिभाषा से अलग है के रूप में परिभाषित किया गया है: उदाहरण के लिए, जीसीसी निम्न त्रुटि फेंकता है। चूंकि संकलक देखता है कि आप को फिर से घोषित कर रहे हैं जो आपकी नई घोषणा की तुलना में एक अलग "नस्ल" है, यदि आपकी अवैध घोषणा एक परिभाषा है या नहीं, तो इससे कम परवाह नहीं किया जा सकता है, क्योंकि यह "परिभाषा" को अलग-अलग मानता है फ़ंक्शन पैरामीटर और फ़ंक्शन स्थानीय चर के संदर्भ में।
हालांकि, अगर आप ऐसा करते हैं:
int c = 20;
int c = 20;
जीसीसी, उदाहरण के लिए, एक परिभाषा त्रुटि फेंकता है, क्योंकि दोनों c
-s समारोह के स्थानीय चर रहे हैं।
परिभाषाएं भी घोषणाएं हैं। एकाधिक घोषणाओं की जांच कई परिभाषाओं के लिए जांचने से पहले निदान की जाती है –
पैरामीटर सूची 'f (int a ...)' घोषित करती है, फिर आप शरीर में 'int a' घोषित करते हैं - पुनर्विक्रय ... –
@ डेविडसी। रैंकिन I लगता है कि वह पूछ रहा है कि क्यों त्रुटि संदेश "एकाधिक परिभाषा" के बजाय "पुन: घोषणा" कहता है –