słowo kluczowe extern w C dotyczy zmiennych C (obiektów danych) i funkcji C. Zasadniczo słowo kluczowe extern rozszerza widoczność zmiennych C i funkcji C. Prawdopodobnie dlatego nazwano go zewnętrznym.
Chociaż większość ludzi prawdopodobnie rozumie różnicę pomiędzy deklaracją a definicją zmiennej lub funkcji, dla kompletności wyjaśnijmy to
- Deklaracja zmiennej lub funkcji po prostu deklaruje, że zmienna lub funkcja istnieje gdzieś w programie, ale nie jest dla nich przydzielona pamięć. Deklaracja zmiennej lub funkcji spełnia ważną rolę – mówi programowi, jaki będzie jej typ. W przypadku funkcjonować deklaracje, informuje także program o argumentach, ich typach danych, kolejności tych argumentów i typie zwracanym przez funkcję. To tyle, jeśli chodzi o deklarację.
- Przyjeżdżam do definicja , kiedy my definiować zmienna lub funkcja, oprócz wszystkiego, co robi deklaracja, przydziela także pamięć dla tej zmiennej lub funkcji. Dlatego możemy myśleć o definicji jako o nadzbiorze deklaracji (lub deklaracji jako podzbiorze definicji).
- Zewnętrzny to krótka nazwa słowa zewnętrzny.
- Zmienna extern jest używana, gdy określone pliki muszą uzyskać dostęp do zmiennej z innego pliku.
Składnia extern w C
Składnia definicji zmiennej extern w C polega po prostu na użyciu słowa kluczowego extern przed deklaracją zmiennej.
extern data_type variable_name;>
Przykład zmiennej zewnętrznej w C
C
tablica vs lista tablic
#include> > extern> int> a;> // int var; ->deklaracja i definicja> > // extern int var; ->deklaracja> > int> main()> {> > printf> (> '%d'> , a);> > > return> 0;> }> |
>
>
Właściwości zmiennej zewnętrznej w C
- Kiedy piszemy extern Some_data_type nazwa_zmiennej; nie jest przydzielana żadna pamięć. Ogłaszana jest tylko właściwość zmiennej.
- W pliku dozwolone jest wielokrotne deklarowanie zmiennej zewnętrznej. Nie dotyczy to zmiennych automatycznych.
- Zmienna extern mówi kompilatorowi: Wyjdź poza mój zakres, a znajdziesz definicję zmiennej, którą zadeklarowałem.
- Kompilator uważa, że cokolwiek powie ta zmienna zewnętrzna, jest prawdą i nie powoduje żadnego błędu. Linker zgłasza błąd, gdy stwierdzi, że taka zmienna nie istnieje.
- Kiedy inicjowana jest zmienna zewnętrzna, wówczas przydzielana jest na nią pamięć i będzie ona uważana za zdefiniowaną.
Może to być zmienna lub funkcja zdeklarowany dowolną ilość razy, ale może tak być zdefiniowany tylko raz. (Pamiętaj o podstawowej zasadzie, że nie można mieć dwóch lokalizacji tej samej zmiennej lub funkcji).
Wróćmy teraz do słowa kluczowego extern. Najpierw rozważmy użycie extern w funkcjach. Okazuje się, że gdy funkcja jest deklarowana lub definiowana, domyślnie zakładane jest słowo kluczowe extern. Kiedy piszemy.
int foo(int arg1, char arg2);>
Kompilator traktuje to jako:
extern int foo(int arg1, char arg2);>
Ponieważ słowo kluczowe extern rozszerza widoczność funkcji na cały program, funkcja może zostać użyta (wywołana) w dowolnym miejscu w dowolnym pliku całego programu, pod warunkiem, że pliki te zawierają deklarację funkcji. (Po deklaracji funkcji kompilator wie, że definicja funkcji istnieje gdzie indziej, więc kompiluje plik). To tyle, jeśli chodzi o elementy zewnętrzne i funkcje.
Rozważmy teraz użycie extern ze zmiennymi. Na początek, jak byś to zrobił ogłosić zmienna bez definiowanie To? Zrobiłbyś coś takiego:
extern int var;>
Tutaj zadeklarowana została zmienna typu całkowitego o nazwie var (nie została jeszcze zdefiniowana, więc na razie nie ma alokacji pamięci dla var). I możemy wykonać tę deklarację tyle razy, ile chcemy.
A teraz, jak byś to zrobił definiować var? Zrobiłbyś to:
int var = 10;>
W tej linii zadeklarowano zmienną typu całkowitego o nazwie var I zdefiniowany (pamiętaj o tym definicja jest nadzbiorem deklaracja ). Ponieważ jest to A definicja , przydzielana jest także pamięć dla var. A teraz niespodzianka. Kiedy deklarowaliśmy/definiowaliśmy funkcję, widzieliśmy, że słowo kluczowe extern było obecne w sposób dorozumiany. Ale tak nie jest w przypadku zmiennych. Gdyby tak było, pamięć nigdy nie zostałaby im przydzielona. Dlatego musimy jawnie dołączyć słowo kluczowe extern, gdy chcemy zadeklarować zmienne bez ich definiowania. Ponadto, ponieważ słowo kluczowe extern rozszerza widoczność na cały program, używając słowa kluczowego extern ze zmienną, możemy użyć zmiennej w dowolnym miejscu programu, pod warunkiem, że zamieścimy jej deklarację, że zmienna jest gdzieś zdefiniowana.
Spróbujmy teraz zrozumieć extern na przykładach.
Przykład 1:
C
int> var;> int> main(> void> )> {> > var = 10;> > return> 0;> }> |
>
>
Ten program kompiluje się pomyślnie. var jest zdefiniowany (i zadeklarowany domyślnie) globalnie.
Przykład 2:
C
25 ze 100
extern> int> var;> int> main(> void> )> {> > return> 0;> }> |
>
>
Ten program kompiluje się pomyślnie. Tutaj zadeklarowano tylko var. Uwaga: var nigdy nie jest używany, więc nie pojawiają się żadne problemy.
Przykład 3:
C
metody listy Java
extern> int> var;> int> main(> void> )> {> > var = 10;> > return> 0;> }> |
>
>
Ten program zgłasza błąd podczas kompilacji (podczas fazy łączenia, więcej informacji tutaj), ponieważ zmienna var jest zadeklarowana, ale nigdzie nie zdefiniowana. Zasadniczo var nie ma przydzielonej pamięci. A program próbuje zmienić wartość zmiennej, która w ogóle nie istnieje, na 10.
Przykład 4:
C
// As we are importing the file and henceforth the> // defination> #include 'somefile.h'> > // Declaring the same variable> extern> int> var;> > // int var;> > // It will throw compiler error as compiler will get> > // confused where the variable is defined> > int> main(> void> )> {> > var = 10;> > return> 0;> }> > // Now it will compile and run successfully> |
>
>
podaj nazwę miasta w USA
Wyjście:
10>
Notatka: Tutaj pojawia się inny scenariusz, co jeśli nie zadeklarujemy extern w powyższym fragmencie kodu?
Zakładając, że plik Somefile.h zawiera definicję var, program ten skompiluje się pomyślnie. Słowo kluczowe „extern” jest używane dla zmiennej, gdy deklarujemy zmienną w jednym pliku i definiujemy ją w innym. Ale tutaj, gdy zaimportujemy ten sam plik do pliku, w którym jest zadeklarowany, tutaj zostanie wygenerowany błąd kompilatora.
Dzieje się tak dlatego, że nadal musimy użyć słowa kluczowego extern w pliku, w którym zadeklarowaliśmy tę zmienną, aby poinformować nasz kompilator, że ta zmienna została zdefiniowana gdzie indziej i że tylko nowe miejsce w pamięci nie zostanie przydzielone, w przeciwnym razie utworzy kolejny blok pamięci które użycie słowa kluczowego „extern” jest bezużyteczne.
Przykład 5:
C
extern> int> var = 0;> int> main(> void> )> {> > var = 10;> > return> 0;> }> |
>
>
Czy myślisz, że ten program będzie działać? Cóż, nadchodzi kolejna niespodzianka ze standardów C. Mówią, że... jeśli zmienna jest tylko zadeklarowana i wraz z tą deklaracją dostarczony jest także inicjator, wówczas pamięć dla tej zmiennej zostanie przydzielona – innymi słowy, zmienna ta będzie uważana za zdefiniowaną. Dlatego, zgodnie ze standardem C, ten program skompiluje się pomyślnie i będzie działać.
Tak wyglądało wstępne spojrzenie na słowo kluczowe extern w C.
W skrócie możemy powiedzieć:
- Deklarację można wykonać dowolną liczbę razy, ale zdefiniowano ją tylko raz.
- słowo kluczowe extern służy do rozszerzenia widoczności zmiennych/funkcji.
- Ponieważ funkcje są domyślnie widoczne w całym programie, użycie extern nie jest potrzebne w deklaracjach funkcji ani definicjach. Jego użycie jest ukryte.
- Kiedy extern jest używany ze zmienną, jest ona tylko deklarowana, a nie definiowana.
- W drodze wyjątku, gdy zmienna zewnętrzna jest deklarowana podczas inicjalizacji, jest ona również traktowana jako definicja zmiennej.