Klíčové slovo extern v C se vztahuje na proměnné C (datové objekty) a C funkce. Klíčové slovo extern v zásadě rozšiřuje viditelnost C proměnných a C funkcí. To je pravděpodobně důvod, proč byl pojmenován externě.
Ačkoli většina lidí pravděpodobně chápe rozdíl mezi deklarací a definicí proměnné nebo funkce, pro úplnost si to ujasněme
- Deklarace proměnné nebo funkce jednoduše deklaruje, že proměnná nebo funkce někde v programu existuje, ale není pro ně alokována paměť. Deklarace proměnné nebo funkce hraje důležitou roli – říká programu, jaký bude její typ. V případě funkce deklarací, také sděluje programu argumenty, jejich datové typy, pořadí těchto argumentů a návratový typ funkce. Takže to je vše o prohlášení.
- Přichází do definice , Když jsme definovat proměnná nebo funkce, kromě všeho, co deklarace dělá, také alokuje paměť pro tuto proměnnou nebo funkci. Definici si tedy můžeme představit jako nadmnožinu deklarace (nebo deklaraci jako podmnožinu definice).
- Extern je krátký název pro externí.
- Externí proměnná se používá, když určité soubory potřebují přistupovat k proměnné z jiného souboru.
Syntaxe extern v C
Syntaxe pro definování externí proměnné v C je pouze použití klíčového slova extern před deklarací proměnné.
extern data_type variable_name;>
Příklad externí proměnné v C
C
#include> > extern> int> a;>// int var; ->deklarace a definice>>> main()> {> >printf>(>'%d'>, a);> > >return> 0;> }> |
>
>
Vlastnosti externí proměnné v C
- Když napíšeme extern some_data_type some_variable_name; není přidělena žádná paměť. Oznámí se pouze vlastnost proměnné.
- V rámci souboru je povoleno více deklarací externí proměnné. To není případ automatických proměnných.
- Externí proměnná říká kompilátoru Přejít mimo můj rozsah a najdete definici proměnné, kterou jsem deklaroval.
- Kompilátor se domnívá, že cokoli, co tato externí proměnná řekla, je pravda a nevyvolává žádnou chybu. Linker vyvolá chybu, když zjistí, že žádná taková proměnná neexistuje.
- Když je externí proměnná inicializována, je pro ni přidělena paměť a bude považována za definovanou.
Proměnná nebo funkce může být prohlásil kolikrát, ale může to být definované pouze jednou. (Pamatujte si základní princip, že nemůžete mít dvě umístění stejné proměnné nebo funkce).
Nyní zpět ke klíčovému slovu extern. Nejprve se podívejme na použití extern ve funkcích. Ukázalo se, že když je funkce deklarována nebo definována, klíčové slovo extern se implicitně předpokládá. Když píšeme.
int foo(int arg1, char arg2);>
Kompilátor to považuje za:
extern int foo(int arg1, char arg2);>
Protože klíčové slovo extern rozšiřuje viditelnost funkce na celý program, lze funkci použít (zavolat) kdekoli v libovolném souboru celého programu, pokud tyto soubory obsahují deklaraci funkce. (S deklarací funkce kompilátor ví, že definice funkce existuje někde jinde, a pokračuje a kompiluje soubor). Takže to je vše o vnějšku a funkcích.
Nyní uvažujme o použití extern s proměnnými. Pro začátek, jak byste prohlásit proměnná bez definující to? Udělali byste něco takového:
extern int var;>
Zde byla deklarována proměnná celočíselného typu s názvem var (dosud nebyla definována, takže zatím žádná alokace paměti pro var). A toto prohlášení můžeme udělat, kolikrát chceme.
A teď, jak byste to udělali vy definovat var? Udělali byste toto:
int var = 10;>
V tomto řádku byla deklarována proměnná typu integer s názvem var a definované (pamatujte na to definice je nadmnožinou prohlášení ). Protože se jedná o a definice , je také přidělena paměť pro var. Nyní přichází překvapení. Když jsme deklarovali/definovali funkci, viděli jsme, že klíčové slovo extern bylo přítomno implicitně. Ale to není případ proměnných. Kdyby tomu tak bylo, paměť by jim nikdy nebyla přidělena. Proto musíme explicitně zahrnout klíčové slovo extern, když chceme deklarovat proměnné, aniž bychom je definovali. Protože klíčové slovo extern rozšiřuje viditelnost na celý program, pomocí klíčového slova extern s proměnnou můžeme proměnnou použít kdekoli v programu za předpokladu, že zahrneme její deklaraci, že proměnná je někde definována.
Nyní se pokusme porozumět externě pomocí příkladů.
Příklad 1:
C
int> var;> int> main(>void>)> {> >var = 10;> >return> 0;> }> |
>
>
Tento program se úspěšně zkompiluje. var je definována (a deklarována implicitně) globálně.
Příklad 2:
C
pole java
extern> int> var;> int> main(>void>)> {> >return> 0;> }> |
>
>
Tento program se úspěšně zkompiluje. Zde je deklarována pouze var. Notice var se nikdy nepoužívá, takže nevznikají žádné problémy.
Příklad 3:
C
extern> int> var;> int> main(>void>)> {> >var = 10;> >return> 0;> }> |
>
>
Tento program vyvolá chybu v kompilaci (během fáze propojení, více informací zde ), protože var je deklarován, ale není nikde definován. V podstatě není varu přidělena žádná paměť. A program se pokouší změnit hodnotu proměnné, která vůbec neexistuje, na 10.
Příklad 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> |
>
>
Výstup:
10>
Poznámka: Zde vyvstává další scénář, co když ve výše uvedeném úryvku kódu neprohlásíme s externem,?
Vzhledem k předpokladu, že somefile.h obsahuje definici var, bude tento program zkompilován úspěšně. Klíčové slovo ‚extern‘ se používá pro proměnnou, když proměnnou deklarujeme v jednom souboru a definujeme ji v jiném souboru. Ale když importujeme stejný soubor do souboru, kde je deklarován, zde se vygeneruje chyba kompilátoru.
Je to proto, že stále musíme použít klíčové slovo extern v souboru, kde jsme tuto proměnnou deklarovali, abychom našemu kompilátoru řekli, že tato proměnná je definována někde jinde, než že nebude přidělen pouze nový paměťový prostor, jinak vytvoří další paměťový blok které použití 'extern' klíčového slova k ničemu.
js načtení
Příklad 5:
C
extern> int> var = 0;> int> main(>void>)> {> >var = 10;> >return> 0;> }> |
>
>
Myslíte si, že tento program bude fungovat? No, přichází další překvapení ze standardů C. Říká se, že...pokud je proměnná pouze deklarována a inicializátor je také opatřen touto deklarací, pak bude alokována paměť pro tuto proměnnou – jinými slovy, tato proměnná bude považována za definovanou. Proto se podle standardu C tento program úspěšně zkompiluje a bude fungovat.
To byl předběžný pohled na klíčové slovo extern v C.
Ve zkratce můžeme říci:
- Deklarace může být provedena libovolněkrát, ale definována pouze jednou.
- klíčové slovo extern se používá k rozšíření viditelnosti proměnných/funkcí.
- Vzhledem k tomu, že funkce jsou ve výchozím nastavení viditelné v celém programu, není použití externí v deklaracích nebo definicích funkcí potřeba. Jeho použití je implicitní.
- Když se extern používá s proměnnou, je pouze deklarována, nikoli definována.
- Výjimečně, když je externí proměnná deklarována s inicializací, je brána také jako definice proměnné.