Considere este archivo, first.cpp
, que contiene una definición de clase y uso:¿Por qué el enlazador ld permite múltiples definiciones de clase con los mismos métodos?
#include <iostream>
struct Foo
{
Foo(){ std::cout << "Foo()" << std::endl; }
~Foo(){ std::cout << "~Foo()" << std::endl; }
};
int main(){
Foo f;
return 0;
}
y otro, second.cpp
, que contiene una definición de clase en conflicto:
#include <iostream>
struct Foo
{
Foo();
~Foo();
};
Foo::~Foo(){ std::cout << "wrong ~Foo()" << std::endl; }
El enlazador se queja de símbolos duplicados cuando hay dos funciones con los mismos nombres definidos, pero estos archivos con métodos de clase duplicados se compilan sin un error.
I compilado con estos comandos:
$ g++ -c second.cpp -o second
$ g++ second first.cpp -o first
Reordenación de los argumentos para la segunda g++
llamada no cambia la salida.
Y cuando first
se ejecuta, esta es la salida:
$ ./first
Foo()
wrong ~Foo()
¿Por qué el enlazador permiten métodos de clase duplicados? Si aparentemente está permitido, ¿por qué se imprime wrong ~Foo()
?
Creo que depende de la versión del compilador, pero lleva el primero que encuentre. – Brady
Es GCC 4.6.1. –
Probablemente tenga algo que ver con la función en línea que da paso a una función de archivo de objeto donde está presente. Supongo que tendrías el mismo problema con el constructor si declaraste una versión no en línea en second.cpp y el problema desaparecería si ambas fuentes declararan las funciones en línea. – forsvarir