Bästa svaret
Förvirra inte en typ (som int
) med andra aspekter av deklarationer (t.ex. en lagringsklass som static
).
Ie, i:
int x;
static int y;
x
och y
har samma typ, int
(termen ” data typ” används mindre vanligt i C och C ++; det är dock inte fel).
Nyckelordet static
har tre olika betydelser i C. I exemplet ovan indikerar det att variabeln y
är ”privat” för den specifika översättningsenheten (eftersom översättningsenheten kan ses som en källfil trots allt #include
-direktiv har bearbetats). Så en variabel y
som deklareras i en annan översättningsenhet skiljer sig från denna.
Här är ett exempel på den andra betydelsen av static
i C:
void f() {
static int n = 2;
...
}
Denna statiska betyder att variabeln n
delas bland alla anrop av f()
och den finns kvar även efter att f()
återvänder (du kan, t.ex. returnera en pekare till den). Initieringen av n
till 2
sker före programstart i C (vid första anrop av f()
i C ++). Så den andra (och senare) tiden f()
åberopas, kommer n
att behålla det värde det hade tidigare (tills programmet uttryckligen ändrar det igen ).
Den tredje betydelsen är mindre vanlig (och, tror jag, mindre känd):
void g(double x[static 5]) {
...
}
Detta indikerar att g()
kan bara anropas med en pekare till det första av minst 5 double
värden i arrayformation.
EDIT: Fast förklaring av lokal statisk initialisering som (se Jesse Pollards kommentar).
Svar
Statisk är motsatsen till dynamik. Va? Det betyder att minnet som tilldelats för den variabeln inte rör sig i minnet. Det betyder också att vid upprepade samtal till funktioner som får åtkomst till variabeln inte skapas nya skuggkopior av variabeln; den ursprungliga variabeln används, och alla andra funktioner som har åtkomst till den variabeln vid den adressen kan ändra eller läsa den. Det är inte i sig en global variabel; dess omfattning förblir densamma som var och hur det definierades. Det kan dock vara. Det skulle dock vara ett fel att försöka definiera en annan statisk variabel med samma namn i samma fil eller en som ingår i en applikation.
överväg en enkel 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 och sista definieras statiska. Det betyder att de värden som läggs i dem kvarstår över flera samtal att lägga till. antal och sista initialiseras till noll, men nollställs sedan inte vid varje samtal. Lägg märke till att omfattningen av räkningen och det sista ligger inom funktionen lägg bara till. De kan inte delas med andra funktioner eller nås utanför tillägget, så för att komma åt dem måste du skriva ut dem inifrån funktionen. Andra funktioner kan ha identiskt antal och sista statiska vars också, och de skulle aldrig interagera.
Titta nu på testprogrammet:
#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 är tre uppsättningar av statiska variabler räknas och sist; alla är separata. Först är globalerna, de används aldrig här. main
har sin egen uppsättning som den använder eftersom dess lokala vars skuggar globalerna. add
har sin egen uppsättning som skuggar både huvud- och globala med samma namn.
Definitioner av statiska funktioner är en annan typ av saker. Ordet statisk indikerar att funktionen bara är synlig i filen som sammanställs från den källa där funktionen är definierad. Detta är antingen källfilen (“.c”) eller en rubrik (“.h) fil ingår i den. Detta kan vara nödvändigt om objektfilerna du använder har mer än en version av en funktion med samma namn (som lägg till, skriv ut, fel, ...) så att kombinera objektfiler (". O") tillsammans som moduler orsakar inte namnkollisioner.