Ce face static
static are două sensuri, după locul în care apare. Pe o variabilă locală, schimbă durata de viață: variabila este creată o singură dată, la pornirea programului, și își păstrează valoarea între apeluri. Inițializarea (= 0) are loc o singură dată și trebuie să fie o constantă.
La nivel de fișier (în afara funcțiilor), static schimbă vizibilitatea (legătura internă): funcția sau variabila globală se vede doar în fișierul .c curent. Alte fișiere pot avea propriile funcții cu același nume fără conflict la legare. Este bine să marchezi static tot ce nu face parte din interfața publică a fișierului.
Variabilele static și cele globale care nu sunt inițializate explicit pornesc de la 0 (sau pointerul nul), spre deosebire de variabilele locale obișnuite, care au valori nedefinite.
Exemple
Exemplul 1: Un contor care ține minte
numar este inițializat o singură dată; la fiecare apel crește valoarea rămasă de la apelul anterior. Variabila local pornește de la 0 la fiecare apel.
#include <stdio.h>
void vizita(void) {
static int numar = 0;
int local = 0;
numar++;
local++;
printf("vizita nr. %d (local = %d)\n", numar, local);
}
int main(void) {
vizita();
vizita();
vizita();
return 0;
}
Rezultat
vizita nr. 1 (local = 1)
vizita nr. 2 (local = 1)
vizita nr. 3 (local = 1)
Exemplul 2: Generator de numere de factură
Funcția întoarce un șir dintr-un tampon static, care rămâne valabil după ieșire. Atenție: următorul apel suprascrie același tampon, de aceea rezultatul se folosește imediat.
#include <stdio.h>
const char *factura_noua(void) {
static int urmatorul = 1;
static char cod[20];
snprintf(cod, sizeof cod, "IS-2026-%04d", urmatorul++);
return cod;
}
int main(void) {
printf("%s\n", factura_noua());
printf("%s\n", factura_noua());
printf("%s\n", factura_noua());
return 0;
}
Rezultat
IS-2026-0001
IS-2026-0002
IS-2026-0003
Exemplul 3: Funcție static: vizibilă doar în fișier
valideaza_nota este un detaliu intern. Fiind static, alt fișier .c din proiect poate avea o funcție cu același nume fără eroare la legare. Variabila globală static neinițializată pornește de la 0.
#include <stdio.h>
static int note_invalide; // implicit 0
static bool valideaza_nota(int n) {
return n >= 1 && n <= 10;
}
int main(void) {
int note[] = {9, 11, 7, 0};
for (int i = 0; i < 4; i++) {
if (!valideaza_nota(note[i])) note_invalide++;
}
printf("Note invalide: %d\n", note_invalide);
return 0;
}
Rezultat
Note invalide: 2
Greșeli frecvente
- Te aștepți ca
static int x = 0;dintr-o funcție să fie resetat la fiecare apel. Inițializarea are loc o singură dată. - Returnezi un tampon
staticși păstrezi pointerul pentru mai târziu. Următorul apel suprascrie conținutul; copiază rezultatul dacă ai nevoie de el. - Folosești variabile locale
staticîn funcții apelate din mai multe fire de execuție. Toate firele împart aceeași variabilă; ai nevoie de sincronizare sau dethread_local.
Comenzi înrudite
extern: Declară o variabilă globală definită în alt fișier (sau mai jos), ca să o poți folosi fără să creezi o copie nouă.Funcții și prototipuri: Cum definești și declari funcții în C: tipul rezultatului, parametrii, prototipul și transmiterea argumentelor prin valoare.Programe din mai multe fișiere (.c și .h): Cum împarți un program C în fișiere sursă (.c) și antete (.h), cum le compilezi separat și cum le legi într-un executabil.snprintf și sprintf: Formatează text ca printf, dar îl scrie într-un tablou de caractere; snprintf nu depășește niciodată dimensiunea dată.
Întrebări & Exemple de Cod:
staticAi o nelămurire despre utilizarea comenzii
staticsau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.