Nie jestem do końca pewien na ten temat w standardach. Że mam trzy pliki tak:Kwalifikator wbudowany wynika z prototypu lub definicji?
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();
}
Teraz definicja foo zostanie skompilowana do obu jednostek kompilacji foo.o i bar.o. Jeśli rozumiem to poprawnie, posiadanie wbudowanych funkcji pozwoli uniknąć kolizji łącznika. G ++ skompilowany i linki to dobrze, ale z brzękiem ++ 2.8 otrzymuję ten błąd:
/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
Wydaje się, że szczęk ++ nie widzieć void foo()
jako inlined funkcji. Działa to jednak dobrze, gdy dodaję również tekst do definicji.
Czy muszę dodać również w linii do void foo()
, aby można go było zobaczyć jako funkcję inline lub czy jest to błąd ++?
Myślę, że masz na myśli "definicję", a nie "deklarację". – Maxpm
Ach, tak, mam tendencję do mieszania tych ...;) – Maister
To interesujące pytanie. –