2010-03-25 15 views

Odpowiedz

2

służy do określenia zmiennej zdefiniowanej w innej jednostce kompilacji (na razie można myśleć o jednostce kompilacji jako pliku .cpp). Wyrażenia w twoim przykładzie: deklarują, a nie definiują. Informuje kompilator, że definicja tych obiektów znajduje się w innej jednostce kompilacji (gdzie są one nie zadeklarowane jako extern).

+0

Ale nigdzie nie znajduję definicji 'cin', tylko' istream' jest zdefiniowane w '' – symfony

+0

'cin' jest obiektem typu' istream'. "istream" jest definicją klasy (w tym przypadku klasy szablonu). 'cin' jest instancją klasy' istream'. "Definicja", o której wspomniałem w mojej odpowiedzi, to definicja "cin", a nie "istream". Musisz przyjrzeć się rozumieniu * definicja * kontra * declaraion *. Instrukcje w przykładach to * deklaracje *. –

+0

Definicja * zmiennej 'cin' najprawdopodobniej znajduje się w bibliotece wykonawczej. Nie znajdziesz go w standardowych plikach nagłówkowych biblioteki. –

2

Nie, jest to wyraźny sposób na stwierdzenie, że cin i są zadeklarowane bez faktycznego ich definiowania.

7

extern oznacza „zmienne te są zdefiniowane w innej jednostce kompilacji (.cpp lub lib pliku)”

W tym przypadku #include <iostream> do pliku .cpp, a ponieważ cin i cout są zadeklarowane jako extern , kompilator pozwoli ci używać ich bez narzekania. Następnie, gdy uruchamia linker, wyszukuje wszystkie zmienne extern i sortuje je.

+0

Czy oznacza to, że istream' lub 'cin' jest zdefiniowane w innej jednostce w przypadku' extern istream cin; '? – symfony

+2

To znaczy, że "cin" jest. To nie jest to samo, co definicja * klasy *, która w tym przypadku jest w 'iostream'. Definicja * klasy * musi zawsze być dostępna w jednostce kompilacji, aby móc używać obiektów tej klasy (dlatego definicje klas są umieszczane w plikach * header *). –

+0

@STingRaySC, możesz rozwinąć trochę? Jestem zdezorientowany dużo .. – symfony

Powiązane problemy