अगर मैं निम्नलिखित कोड के साथ एक फ़ाइल foo.cpp
है:सीपीपी फाइलों में एक वर्ग को परिभाषित करने से लिंकर त्रुटि क्यों नहीं होती है?
class Foo {
};
class Foo {
};
int main() {
return 0;
}
तो स्वाभाविक रूप से मैं error: redefinition of 'Foo'
मिलता है। हालांकि, अगर मैं foo.cpp
class Foo {
};
int main() {
return 0;
}
और bar.cpp
साथ
class Foo {
};
साथ class Foo
के बावजूद कार्यक्रम भर में दो बार परिभाषित किया जा रहा है, यह पूरी बात ठीक संकलित करता है।
यदि मैंने वैश्विक नामस्थान में दोनों फ़ाइलों में int something;
डाल दिया था, तो मुझे एक लिंकर त्रुटि (विशेष रूप से duplicate symbol
) मिल गई होगी, लेकिन कक्षा परिभाषाओं के लिए, यह कभी नहीं होता है।
मुझे पता है कि int doIt();
जैसे फ़ंक्शन घोषणाएं दोनों सीपीपी फ़ाइलों में डुप्लिकेट की जा सकती हैं, लेकिन परिभाषा, उदा। int doIt() {}
नहीं हो सकता है। अब पहली कंपाइलर त्रुटि में (class Foo{};
एक सीपीपी फ़ाइल में दो बार), यह redefinition of foo
कहा गया, इसलिए class Foo{};
एक परिभाषा है। तो क्यों, कार्यों के विपरीत, क्या इसे एक कार्यक्रम में दो बार परिभाषित किया जा सकता है?
संपादित करें:this website के अनुसार, नामित वर्गों में बाहरी संबंध है। तो फिर दोनों सीपीपी फाइलों में class Foo
के बीच कोई संघर्ष क्यों नहीं है?
EDIT2: उपरोक्त वेबसाइट के अनुसार, न केवल नामित वर्गों के बाहरी संबंध हैं, बल्कि यह स्थिर सदस्य भी हैं। फिर भी यह सब ठीक संकलित:
foo.cpp
:
class Foo {
public:
int foo();
static int x;
};
int Foo::foo() {
return 5;
}
int main() {
return 0;
}
bar.cpp
:
class Foo {
public:
int foo(int);
static bool x;
};
int Foo::foo(int i) {
return i * 2;
}
इतना ही नहीं Foo::foo
एक अलग हस्ताक्षर के साथ नए सिरे से परिभाषित किया गया है, लेकिन Foo::x
एक अलग प्रकार की है। इन दोनों में बाहरी संबंध होना चाहिए, फिर भी यह कोड ए-ओके है।
वह कंपाइलर क्या है? –
इस प्रश्न पर चर्चा की गई है [http://stackoverflow.com/questions/6465325/do-classes-have-external-linkage), tl; dr; जब एक ही नाम के साथ कक्षाएं (एनम्स, यूनियन, इत्यादि) अलग-अलग अनुवाद इकाइयों में अलग-अलग परिभाषित की जाती हैं, तो उनके पास आंतरिक या कोई संबंध नहीं होता है, इसलिए कोई त्रुटि नहीं होती है। ध्यान दें, स्वीकार किए गए उत्तर में गलत है और अधिक अपवर्तित वाला एक सही है। – VTT
@ ΦXocę 웃 Пepeúpa ツ ऐप्पल एलएलवीएम संस्करण 7.3.0 (क्लैंग -703.0.31) – rcplusplus