Considerate questo file, first.cpp
, contenente una definizione di classe ed impiego:Perché il linker ld consente più definizioni di classe con gli stessi metodi?
#include <iostream>
struct Foo
{
Foo(){ std::cout << "Foo()" << std::endl; }
~Foo(){ std::cout << "~Foo()" << std::endl; }
};
int main(){
Foo f;
return 0;
}
e un altro, second.cpp
, contenente una definizione di classe in conflitto:
#include <iostream>
struct Foo
{
Foo();
~Foo();
};
Foo::~Foo(){ std::cout << "wrong ~Foo()" << std::endl; }
Il linker lamenta simboli duplicati quando ci sono due funzioni con gli stessi nomi definiti, ma questi file con metodi di classe duplicati vengono compilati senza errori.
ho compilato con questi comandi:
$ g++ -c second.cpp -o second
$ g++ second first.cpp -o first
Riordino gli argomenti alla seconda g++
chiamata non cambia l'uscita.
E quando first
viene eseguito, questo è l'output:
$ ./first
Foo()
wrong ~Foo()
Perché il linker consentire metodi di classe duplicati? Se è apparentemente consentito, perché è stampato wrong ~Foo()
?
Penso che dipende dalla versione del compilatore, ma ci vuole il primo che trova. – Brady
È GCC 4.6.1. –
Probabilmente ha qualcosa a che fare con la funzione di inlining che dà il via ad una funzione di file oggetto dove è presente. Immagino che avresti lo stesso problema con il costruttore se hai dichiarato una versione non inline in second.cpp e il problema scomparirebbe se entrambe le fonti dichiarassero le funzioni in linea. – forsvarir