5.1. Variabile globale

2019/02/22 in Programare in C

Variabilele globale au o definitie si eventual una sau mai multe declaratii de variabila externa.

Definitia unei variabile globale coincide cu o declaratie obisnuita, care insa este scrisa in afara corpului oricarei functii a programului.

O astfel de definitie, de obicei, se scrie la inceputul unui fisier sursa. Aceasta deoarece ea este valabila din locul in care este scrisa si pana la sfarsitul fisierului respectiv.

In cazul in care programul se compune din mai multe fisiere sursa, o variabila globala poate fi utilizata intr-un fisier sursa in care nu este definita daca este declarata ca variabila externa in acel fisier. O declaratie de variabila externa coincide cu o declaratie de variabila obisnuita precedata de cuvantul cheie extern.

Exemplu:

Un program se compune din doua fisiere sursa, fis1.cpp si fis2.cpp. In fis1.cpp se definesc variabilele globale zi, luna si an de tip int. Aceste variabile se utilizeaza atat in fis1.cpp, cat si in fis2.cpp. Daca aceste fisiere se compileaza separat, folosind un fisier de tip project sau daca fisierul fis2.cpp se include in fisierul fis1.cpp inainte de a defini variabilele globale respective, atunci ele nu sunt definite in fis2.cpp si in consecinta nu pot fi utilizate in functiile din fisierul fis2.cpp. Pentru a elimina acest neajuns, vom declara variabilele respective ca externe in functiile din fisierul fis2.cpp.

Fisierul fis1.cpp

int zi, luna, an;

/* Definitie de variabile globale.
Aceste variabile pot fi folosite 
in toate functiile din fis1.cpp 
care urmeaza dupa aceasta definitie */

...
tip f(...)
  {
  int i;
  ...
  i = an % 4 == 0 && an % 100 != 0 || an % 400 == 0;
  ...
  if (luna == 2)
    zi = 28 + i;
  ...
  }

tip g(...)
  {
  ...
  if (zi <= 27)
    zi++;
  ...
  if (zi == 31 && luna == 12)
    an++;
  ...
}

Fisierul fis2.cpp

...
main()
{
  extern int zi, luna, an;

/* declaratie de extern pentru 
variabilele globale zi, luna si an 
definite in fis1.cpp;
este valabila in corpul functiei main */

  ...
  if (zi < 1 || zi > 31)
    printf("ziua eronata\n");
  if (luna < 1 || luna > 12)
    printf("luna eronata\n");
  if (an < 1600 || an > 4900)
    printf("anul eronat\n");
  ...
} /* sfarsit main */

tip p(...)
  {
  ...
/* nu exista declaratii de extern pentru 
variabilele globale zi, luna si an; 
in acest caz nu se pot utiliza 
variabilele respective numai daca fis2.cpp 
se include in fis1.cpp 
dupa definitia acestor variabile globale*/

  ...
  zi = 15; /* zi apare la compilare ca fiind nedefinita */
  ...
  }

Observatie:

Intrucat repartizarea functiilor in fisiere poate sa se modifice pe masura ce se construieste programul, se recomanda ca orice utilizare a unei variabile globale sa fie precedata de declaratia de extern a ei.

Variabilele globale sunt alocate in momentul compilarii. Lor li se aloca memorie, la intalnirea definitiilor lor, intr-o zona de memorie prevazuta special pentru variabilele globale ale programului.

5.2. Variabile locale