Czytam „Think in C ++” i właśnie wprowadziłem extern
deklarację. Na przykład:
extern int x;
extern float y;
Myślę, że rozumiem znaczenie (deklaracja bez definicji), ale zastanawiam się, kiedy okaże się przydatne.
Czy ktoś może podać przykład?
c++
variable-declaration
Aslan986
źródło
źródło
extern
Kilkakrotnie musiałem podać definicję . Narzędzia Microsoft spowodowały błąd łącza dla brakujących symboli, gdy tabele w innym pliku źródłowym zostały zdefiniowane. Problem polegał na tym, że tabela była,const
a kompilator C ++ promował jąstatic
w jednostce tłumaczeniowej. Zobacz na przykładariatab.cpp
ikalynatab.cpp
.Odpowiedzi:
Jest to przydatne, gdy masz zmienne globalne. W nagłówku deklarujesz istnienie zmiennych globalnych, tak aby każdy plik źródłowy zawierający nagłówek wiedział o nim, ale wystarczy „zdefiniować” go tylko raz w jednym ze swoich plików źródłowych.
Aby to wyjaśnić, użycie
extern int x;
informuje kompilator, że obiekt typu oint
nazwiex
jest gdzieś istnieje . Nie jest zadaniem kompilatora wiedzieć, gdzie on istnieje, wystarczy znać typ i nazwę, aby wiedzieć, jak go używać. Po skompilowaniu wszystkich plików źródłowych konsolidator rozwiąże wszystkie odwołaniax
do jednej definicji, którą znajdzie w jednym ze skompilowanych plików źródłowych. Aby zadziałało, definicjax
zmiennej musi mieć tak zwane „powiązanie zewnętrzne”, co w zasadzie oznacza, że należy ją zadeklarować poza funkcją (w tak zwanym „zakresie plików”) i bezstatic
słowa kluczowego.nagłówek:
źródło 1:
źródło 2:
źródło
Jest to przydatne, gdy udostępniasz zmienną między kilkoma modułami. Zdefiniuj go w jednym module, a w innych użyj zewnętrznego.
Na przykład:
w pliku1.cpp:
w pliku2.cpp:
źródło
global_int
w grę wchodzą przestrzenie nazw, jest w globalnej przestrzeni nazw, gdybym używał jej w pliku file2.cpp w jakiejś sekcji przestrzeni nazw, to musiałbym ją poprawnie zakreślić? tj.namespace XYZ{ void foo(){ ::global_int++ } };
abc.h
, istnieje duża szansa, że zostanie zdefiniowanaabc.cpp
. Dobre IDE zawsze pomoże, ale dobrze zorganizowany kod jest zawsze lepszym rozwiązaniem.extern
pliku2.cpp nadal można uzyskać dostęp doglobal_int
po dołączeniu. dlaczego muszę to mieć?Chodzi o połączenie .
Poprzednie odpowiedzi dostarczyły dobrych wyjaśnień na temat
extern
.Ale chcę dodać ważną kwestię.
Pytasz
extern
w C ++, a nie w C i nie wiem, dlaczego nie ma odpowiedzi na temat przypadku, gdyextern
jestconst
w C ++.W C ++
const
zmienna ma domyślnie wewnętrzne powiązanie (nie tak jak C).Więc ten scenariusz doprowadzi do błędu połączenia :
Źródło 1:
Źródło 2:
Musi być tak:
Źródło 1:
Źródło 2:
źródło
extern
definicji? Możesz to zrobić, drukując wartośćglobal
w źródle 2.extern
jest pominiętaconst int global = 255;
.Jest to przydatne, gdy chcesz mieć zmienną globalną. Definiujesz zmienne globalne w jakimś pliku źródłowym i deklarujesz je jako zewnętrzne w pliku nagłówkowym, aby każdy plik zawierający ten plik nagłówkowy zobaczył tę samą zmienną globalną.
źródło