2012-02-18 11 views
12

Zdefiniowałem funkcję show() zgodnie z opisem w pliku nagłówkowym o nazwie ex.h i definicją funkcji wewnątrz ex.cpp. Spodziewałem się, że spowoduje to błąd, ponieważ kompilator nie będzie wiedział, co zastąpić, gdzie wywoływana jest funkcja show(). Ale ponieważ używam IDE, działało dobrze. Jak to mogło się stać?Czy definicja funkcji wbudowanych w C++ musi należeć do tego samego pliku?

I BTW, gdy próbowałem skompilować go ręcznie, dało mi błąd, że show() jest używany, ale nie zdefiniowany.

Odpowiedz

21

Konieczne jest umieszczenie definicji funkcji (część między {...}) w pliku nagłówkowym, chyba że funkcja jest używana tylko w jednym pliku .cpp.
W szczególności, jeśli wstawisz definicję funkcji śródliniowej do pliku .cpp i wywołasz ją z innego pliku .cpp, otrzymasz błąd "unresolved external" od linkera.

[read more]

4

Zazwyczaj wszystkie funkcje wbudowane występują w .h Powodem jest, że kompilator musi widzieć całą definicję śródliniową z przodu. Funkcje inline są kompilowane przez bezpośrednie "wklejanie" emitowanego języka maszyny.

6

Zwykle umieścić funkcję inline w pliku nagłówka, więc kompilator widzi definicję podczas kompilacji kodu, który wykorzystuje funkcję. W ten sposób działa ze wszystkimi kompilatorami.

Niektóre kompilatory mają funkcje do optymalizacji całego programu na raz (Whole program optimization lub Link time optimization). Kompilatory te mogą wstawiać funkcję, nawet jeśli jest ona zdefiniowana w innym pliku .cpp.

Powiązane problemy