Rozważmy następujący plik first.cpp
, zawierający definicję klasy i zastosowanie:Dlaczego łącznik LD dopuszcza wiele definicji klas za pomocą tych samych metod?
#include <iostream>
struct Foo
{
Foo(){ std::cout << "Foo()" << std::endl; }
~Foo(){ std::cout << "~Foo()" << std::endl; }
};
int main(){
Foo f;
return 0;
}
a inny, second.cpp
, zawierający konflikt definicję klasy:
#include <iostream>
struct Foo
{
Foo();
~Foo();
};
Foo::~Foo(){ std::cout << "wrong ~Foo()" << std::endl; }
Łącznik narzeka na zduplikowane symboli, gdy istnieją dwa funkcje o tych samych nazwach, ale te pliki z powielonymi metodami klasy kompilują się bezbłędnie.
skompilowany z tych poleceń:
$ g++ -c second.cpp -o second
$ g++ second first.cpp -o first
Zmiana kolejności argumenty do drugiego g++
zaproszenia nie zmienia wyjście.
A kiedy first
jest prowadzony, jest to wyjście:
$ ./first
Foo()
wrong ~Foo()
Dlaczego łącznik pozwalają zduplikowane metod klasy? Jeśli jest to dozwolone, dlaczego wydrukowano wrong ~Foo()
?
myślę, że to zależy od wersji kompilatora, ale to trwa pierwszy z nich znajdzie. – Brady
To GCC 4.6.1. –
To prawdopodobnie ma coś wspólnego z funkcją wstawiania ustępującą funkcji pliku obiektowego, w której jest obecna. Domyślam się, że masz taki sam problem z konstruktorem, jeśli zadeklarowałeś wersję nieinsertowaną w second.cpp i problem zniknąłby, gdyby oba źródła zadeklarowały funkcje inline. – forsvarir