Bedste svar
Forveks ikke en type (som int
) med andre aspekter af erklæringer (f.eks. en lagerklasse som static
).
Ie, i:
int x;
static int y;
x
og y
har samme type, int
(udtrykket “ data type” bruges mindre almindeligt i C og C ++; det er dog ikke forkert).
Nøgleordet static
har tre forskellige betydninger i C. I eksemplet ovenfor angiver det at variablen y
er “privat” for den pågældende oversættelsesenhed (som oversættelsesenhed kan trods alt betragtes som en kildefil #include
direktiver er blevet behandlet). Så en variabel y
, der er erklæret i en anden oversættelsesenhed, adskiller sig fra denne.
Her er et eksempel på den anden betydning af static
i C:
void f() {
static int n = 2;
...
}
Denne statiske betyder, at variablen n
deles blandt alle påkaldelser af f()
og den forbliver i eksistens, selv efter at f()
vender tilbage (du kunne, f.eks. returnere en markør til den). Initialiseringen af n
til 2
sker inden programmets opstart i C (ved første påkaldelse af f()
i C ++). Så det andet (og senere) tidspunkt f()
påberåbes, vil n
beholde den værdi, det havde før (indtil programmet eksplicit ændrer det igen ).
Den tredje betydning er mindre almindelig (og efter min mening mindre velkendt):
void g(double x[static 5]) {
...
}
Dette indikerer at g()
kan kun kaldes med en markør til den første af mindst 5 double
værdier i array-dannelse.
EDIT: Fast forklaring på lokal statisk initialisering som (se Jesse Pollards kommentar).
Svar
Statisk er det modsatte af dynamik. Hvad? Det betyder, at den hukommelse, der er allokeret til den variabel, ikke bevæger sig i hukommelsen. Det betyder også, at der ved gentagne opkald til funktioner, der har adgang til variablen, ikke oprettes nye skyggekopier af variablen; den oprindelige variabel bruges, og enhver anden funktion, der får adgang til den variabel på den adresse, kan ændre eller læse den. Det er ikke i sig selv en global variabel; dets omfang forbliver det samme som hvor og hvordan det blev defineret. Det kunne dog være. Det ville være en fejl at forsøge at definere en anden statisk variabel med samme navn i den samme fil eller en, der er inkluderet i en applikation.
Overvej en simpel C add-funktion:
int add(int a, int b)
{
static int count = 0;
static int last = 0;
count++;
last = a + b;
printf( "a:\t\%d \t\t b:\t\%d\n", a, b );
printf( "count:\t\%d \t\t last:\t\%d\n", count, last)
return last;
}
antal og sidste defineres statisk. Det betyder, at de værdier, der er sat i dem, fortsætter over flere opkald, der skal tilføjes. optælling og sidste initialiseres til nul, men nulstilles derefter ikke ved hvert opkald. Bemærk, at omfanget af optælling og sidste er inden for funktionen kun tilføj. De deles muligvis ikke med andre funktioner eller er tilgængelige uden for tilføjelsen, så for at komme til dem skal du udskrive dem indefra funktionen. Andre funktioner kunne også have samme antal og sidste statiske vars, og de ville aldrig interagere.
Se nu på dette testprogram:
#include
static int count = 5;
static int last = 0;
int add(int a, int b)
{
static int count = 0;
static int last = 0;
count++;
last = a + b;
printf( "a:\t\%d \t\t b:\t\%d\n", a, b );
printf( "count:\t\%d \t\t last:\t\%d\n", count, last)
return last;
}
int main(int argc, char**argv )
{
static int count = 10;
static int last = 0;
int i;
int a=1, b=1;
for(i = 0 ; i < count ; i++)
{
a = add(a, b);
b = add(a, last);
last = add(a, b);
}
printf( "a:\t\%d \t\t b:\t\%d\n", a, b );
printf( "count:\t\%d \t\t last:\t\%d\n", count, last);
return 0;
}
Tre er 3 sæt statiske variabler tæller og sidst; alle er adskilte. Først er de globale, de bruges aldrig her. main
har sit eget sæt, som det bruger, fordi dets lokale vars skygger globuserne. add
har sit eget sæt, der skygger både hoved- og globaler med samme navn.
Definitioner af statisk funktion er en anden slags ting. Ordet statisk angiver, at funktionen kun er synlig i filen, der er kompileret fra den kilde, hvor funktionen er defineret. Dette er enten kildefilen (“.c”) eller en overskrift (“.h) fil inkluderet i den. Dette kan være nødvendigt, hvis de objektfiler, du bruger, har mere end en version af en funktion med samme navn (som tilføj, udskriv, fejl osv.), Så kombination af objektfiler (“. O”) sammen som moduler forårsager ikke navngivning af kollisioner.