Pasé días en un problema extraño y finalmente descubrí que había dos funciones inline
de la misma firma en el proyecto y que causaron el problema. Para simplificar la situación aquí es un ejemplo: archivo de dos CPP:¿Qué ocurre si redefinimos una función en línea?
a.cpp
#include <iostream>
void b();
inline void echo()
{
std::cout << 0 << std::endl;
}
int main()
{
echo();
b();
return 0;
}
y b.cpp
#include <iostream>
inline void echo()
{
std::cout << 1 << std::endl;
}
void b()
{
echo();
}
Tenga en cuenta que inline
funciones echo
tienen la misma firma pero diferente implementos. Compilar y ejecutar
g++ a.cpp b.cpp -o a.out && ./a.out
O como esta
g++ a.cpp -c
g++ b.cpp -c
g++ a.o b.o -o a.out
./a.out
Imprime 0 0
. (Yo estaba usando g ++ 4.6.1 para eso, y he probado con sonido metálico ++ 2.9, mismo resultado)
Eso no sucederá si encender la optimización, como
g++ -O3 a.cpp b.cpp -o a.out && ./a.out
Es 0 1
este momento.
Mi pregunta es, sin importar el resultado o cómo se realiza la compilación, no hay ningún error o incluso advertencia sobre que he definido inline
funciones varias veces. ¿Qué sucede con el compilador y el enlazador en este tipo de situación?
EDIT:
Tome un vistazo a los símbolos en el archivo de objeto
nm a.o b.o | c++filt
Ambos archivos tienen el registro echo()
. Entonces, creo que el problema ocurre en el momento del enlace. ¿Podría decirse que el enlazador selecciona aleatoriamente una implementación y descarta todas las demás?
¿Ha probado una mayor verbosidad de advertencia (-Wall, etc.)? – schnaader
Acabo de probar '-Wall -Wextra', todavía sin aviso. – neuront