C keele extern selgitatud: kuidas jagada globaalseid muutujaid eri failide vahel

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.

年収訴求