2016-12-29 11 views
5

में कई बार फ़ंक्शंस और चर घोषित करना C++ में, एक चर कई बार घोषित करने के दौरान संकलन के दौरान त्रुटि दिखाई देती है। उदाहरण के लिए:सी ++

int x; 
int x; 

एक समारोह को कई बार घोषित करते समय संकलन के दौरान कोई त्रुटि नहीं दिखती है। उदाहरण के लिए:

int add(int, int); 
int add(int, int); 

सी ++ में यह भेद क्यों है?

+0

फ़ंक्शन को ओवरलोड किया जा सकता है लेकिन पैरामीटर की संख्या और प्रकार अलग-अलग होना चाहिए। चर को अधिभारित नहीं किया जा सकता है। – nischalinn

+0

यह सिर्फ अपने पुनर्विक्रय को अधिभारित नहीं कर रहा है। घोषणा किसी भी समय की जा सकती है। – user1438832

+0

जो फ़ंक्शन की घोषणा नहीं है, यह प्रोटोटाइप की घोषणा है, जिसे कई बार किया जा सकता है। वास्तव में सी के बाद यह भेद है। प्रोटोटाइप शरीर के बिना घोषणा है, घोषणा और शरीर को परिभाषा माना जाता है, जो केवल – Swift

उत्तर

12

ध्यान दें कि int x; नहीं है (बस) declaration, यह definition है। तो ODR के बाद से उत्पन्न हुई त्रुटि का उल्लंघन किया जाता है, यानी एक अनुवाद इकाई में केवल एक परिभाषा की अनुमति है।

चर का एक घोषणा के रूप में लिखा जा सकता है:

// a declaration with an extern storage class specifier and without an initializer 
extern int x; 
extern int x; 

इस बीच int add(int, int); में एक घोषणा (समारोह के) ठीक है। एक अनुवाद इकाई में कई घोषणाएं ठीक हैं, ओडीआर का उल्लंघन नहीं किया जाता है।

+1

हो सकता है आप शायद जारी रखना और समझाएं कि घोषणा 'int add (int int)' परिभाषा नहीं है, इसलिए ओडीआर लागू नहीं होता है। – Peter

+0

स्पष्टीकरण के लिए धन्यवाद! यह मेरे संदेह का जवाब देता है। :) –

+0

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