1. Mis on extern
?
C-keeles tähendab extern
, et soovid kasutada muutujat või funktsiooni, mis on defineeritud mõnes teises failis. See on nagu “laenamise” märguanne, kui vajad midagi teisest failist. Näiteks kui defineerid globaalse muutuja ühes failis ja soovid seda kasutada teises failis, siis kasutad extern
-i. Kui programm koosneb mitmest failist, aitab extern
andmeid nende vahel jagada.
Kujutle, et sinu programmis on palju ruume ja extern
on nagu “laenuleping”, millega saad naaberruumist tööriista. See tähendab: “see asi ei ole siin, aga asub kõrvalruumis.”
Näide
// file1.c
int g_data = 100;
// file2.c
extern int g_data;
void printData() {
printf("%dn", g_data); // pääseb ligi g_data-le failist file1.c
}
Selles näites on g_data
defineeritud failis file1.c
, kuid tänu extern
-ile pääseb sellele ligi ka failis file2.c
.

2. extern
ja globaalsed muutujad
extern
on eriti tihedalt seotud globaalsete muutujatega. Globaalne muutuja on defineeritud üks kord kogu programmi ulatuses ja sellele saab ligi igast failist. Kuid teised failid ei tea selle muutujast midagi, kui neile ei öelda, et see eksisteerib – siin tulebki appi extern
, mis ütleb: “see muutuja on olemas teises failis!”
Tähtis on meeles pidada, et extern
on ainult deklaratsioon – see ei eralda muutujale mäluruumi. Muutuja tegelik mäluruum eraldatakse failis, kus ta on defineeritud.
Näide globaalsest muutujast
// file1.c
int counter = 0;
// file2.c
extern int counter; // kasutab counter-it, mis on defineeritud teises failis
void incrementCounter() {
counter++; // suurendab counter-i väärtust
}
3. extern
kasutamine päisefailides
Suurtes projektides võib muutujate ja funktsioonide korduvalt deklareerimine olla tülikas. Siin tulevad appi päisefailid (header files). Päisefailid koondavad ühte kohta kogu teabe, mida soovitakse jagada teiste failidega. Kui paned extern
-deklaratsioonid päisefaili, saavad teised failid kasutada samu globaalseid muutujaid ja funktsioone ilma korduvate deklaratsioonideta.
Päisefaili võib võrrelda projekti “tööriistakastiga” – kõik ühised tööriistad on ühes kohas ning teised failid saavad neid vajadusel kasutada.
Näide päisefailist
// globals.h
extern int global_variable;
void printGlobalVariable();
// file1.c
#include "globals.h"
int global_variable = 10;
// file2.c
#include "globals.h"
void printGlobalVariable() {
printf("%dn", global_variable);
}

4. Levinumad vead extern
kasutamisel
extern
-i kasutamisel tuleb olla tähelepanelik, sest on mõned tavalised vead. Näiteks ei tohi extern
-deklaratsiooni juures muutujaid initsialiseerida. extern
tähendab ainult “deklareerimist”, mitte “defineerimist”. Kui proovite määrata väärtust koos extern
-iga, tekib kompileerimisviga.
Tüüpiline viga
extern int data = 100; // Initsialiseerimine ei ole lubatud
Nagu näites näha, annab extern
-i koos algväärtusega kasutamine vea. extern
viitab muutujale, mis on defineeritud teises failis, ning ei ole mõeldud uue muutuja loomiseks ega initsialiseerimiseks.
5. Praktilised näited extern
kasutamisest
extern
on eriti kasulik suurtes projektides. Kui programm koosneb mitmest moodulist (failist), saab ühiseid andmeid ja funktsioone deklareerida extern
-iga ning kasutada neid erinevates failides.
Sellistes projektides aitab extern
kaasa programmi modulaarsele ülesehitusele, parandades hooldatavust ja loetavust. Iga fail saab töötada iseseisvalt, jagades samal ajal vajalikke andmeid teistega.
Praktiline näide
// main.c
#include "globals.h"
int main() {
printGlobalVariable(); // kutsub välja funktsiooni, mis on defineeritud teises failis
return 0;
}
// globals.c
#include "globals.h"
int global_variable = 100;
void printGlobalVariable() {
printf("%dn", global_variable); // väljastab globaalse muutuja väärtuse
}
Selles artiklis käsitlesime extern
-i aluseid ja selle praktilist kasutust. See on oluline märksõna C-keeles, mis aitab kaasa programmide jagamisele ja taaskasutamisele. extern
-i rollist arusaamine on oluline, kui soovid luua struktureeritud ja hooldatavat koodi.