इस फाइल, first.cpp
पर विचार करें, एक वर्ग परिभाषा और उपयोग युक्तएलडी लिंकर एक ही तरीके से एकाधिक कक्षा परिभाषाओं को क्यों अनुमति देता है?
#include <iostream>
struct Foo
{
Foo(){ std::cout << "Foo()" << std::endl; }
~Foo(){ std::cout << "~Foo()" << std::endl; }
};
int main(){
Foo f;
return 0;
}
और एक अन्य, second.cpp
, एक परस्पर विरोधी वर्ग परिभाषा युक्त
#include <iostream>
struct Foo
{
Foo();
~Foo();
};
Foo::~Foo(){ std::cout << "wrong ~Foo()" << std::endl; }
लिंकर डुप्लिकेट प्रतीकों के बारे में शिकायत जब वहाँ दो हैं एक ही नाम के साथ कार्यों को परिभाषित किया गया है, लेकिन डुप्लिकेट क्लास विधियों वाली इन फ़ाइलों को बिना किसी त्रुटि के संकलित किया गया है।
मैं इन आदेशों के साथ संकलित:
$ g++ -c second.cpp -o second
$ g++ second first.cpp -o first
दूसरा g++
कॉल करने के लिए तर्क पुन: क्रम उत्पादन नहीं बदलता है।
और जब first
चलाया जाता है, यह उत्पादन होता है:
$ ./first
Foo()
wrong ~Foo()
क्यों लिंकर डुप्लिकेट वर्ग तरीकों अनुमति देता है? यदि यह स्पष्ट रूप से अनुमति है, तो wrong ~Foo()
मुद्रित क्यों है?
मैं इसे संकलक के संस्करण पर निर्भर करता है लगता है, लेकिन यह पहले एक यह पाता है लेता है गिरा दिया। – Brady
यह जीसीसी 4.6.1 है। –
यह शायद ऑब्जेक्ट फ़ाइल फ़ंक्शन को पेश करने के तरीके को जोड़ने में फ़ंक्शन के साथ कुछ करना है जहां यह मौजूद है। मुझे लगता है कि अगर आप दूसरे.cpp में एक गैर-इनलाइन संस्करण घोषित करते हैं तो आपको कन्स्ट्रक्टर के साथ एक ही समस्या होगी और यदि दोनों स्रोतों ने इनलाइन फ़ंक्शन को अस्वीकार कर दिया तो समस्या दूर हो जाएगी। – forsvarir