मुझे मानकों में इस बारे में बिल्कुल यकीन नहीं है।इनलाइन क्वालीफायर प्रोटोटाइप या परिभाषा से उपजी है?
foo.h
#include <iostream>
inline void foo();
void foo()
{
std::cout << "Foo" << std::endl;
}
foo.cpp:
#include "foo.h"
void baz();
int main()
{
baz();
foo();
}
bar.cpp
#include "foo.h"
void baz()
{
foo();
}
मैं इस तरह तीन फ़ाइलें कहना अब, foo की परिभाषा दोनों संकलन इकाइयों foo.o और bar.o में संकलित की जाएगी। अगर मैं इसे सही ढंग से समझता हूं, तो इनलाइन फ़ंक्शंस होने से लिंकर टकराव से बच जाएगा। जी ++ संकलित और लिंक इस ठीक है, लेकिन बजना ++ 2.8 के साथ मैं इस त्रुटि मिलती है:
/tmp/cc-7RdmYP.o: In function `foo()':
bar.cpp:(.text+0x50): multiple definition of `foo()'
/tmp/cc-LW3id3.o:foo.cpp:(.text+0x50): first defined here
collect2: ld returned 1 exit status
ऐसा नहीं है कि बजना ++ void foo()
एक inlined समारोह के रूप में नहीं देखा है लगता है। हालांकि, जब मैं परिभाषा में इनलाइन जोड़ता हूं तो यह ठीक काम करता है।
क्या मुझे void foo()
पर इनलाइन जोड़ना है, साथ ही इसे एक इनलाइन फ़ंक्शन के रूप में देखा जाना चाहिए, या यह एक क्लैंग ++ बग है?
मुझे लगता है कि आपका मतलब "परिभाषा" नहीं है, "घोषणा"। – Maxpm
आह, हाँ, मैं उनको मिश्रण करता हूं ...;) – Maister
यह एक दिलचस्प सवाल है। –