No estoy seguro de esto en los estándares. Decir que tengo tres archivos como este:calificador en línea se deriva de prototipo o definición?
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();
}
Ahora, la definición de foo se compilará en ambas unidades de compilación foo.o y bar.o. Si lo entiendo correctamente, tener funciones inline evitará la colisión del enlazador. G ++ compila y vincula esta muy bien, pero con ruido metálico ++ 2.8 me sale este error:
/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
Parece que tañido ++ no ve void foo()
como una función inline. Sin embargo, funciona bien cuando agrego en línea a la definición también.
¿Debo agregar inline al void foo()
también aquí para que se lo vea como una función inline, o es esto un error de clang ++?
Creo que te refieres a "definición", no "declaración". – Maxpm
Ah, sí, tiendo a mezclar esos ...;) – Maister
Esta es una pregunta interesante. –