Nejlepší odpověď
Nezaměňujte typ (například int
) s dalšími aspekty deklarací (např. třída úložiště jako static
).
Tj. v:
int x;
static int y;
x
a y
mají stejný typ, int
(výraz „ data typ“ je méně běžně používán v C a C ++; není to však špatné).
Klíčové slovo static
má v jazyce C tři různé významy. Ve výše uvedeném příkladu označuje tato proměnná y
je „soukromá“ pro tuto konkrétní překladovou jednotku (protože překladovou jednotku lze po všech #include
směrnicích považovat za zdrojový soubor byly zpracovány). Proměnná y
deklarovaná v jiné překladové jednotce se tedy od této liší.
Zde je příklad druhého významu static
v C:
void f() {
static int n = 2;
...
}
Tato statická hodnota znamená, že proměnná n
je sdílena mezi všemi vyvoláními f()
a zůstává v existenci i po f()
návratu (můžete, např. vrátit na něj ukazatel). Inicializace n
na 2
pouze proběhne před spuštěním programu v C (na prvním vyvolání f()
v C ++). Vyvolá se tedy druhý (a novější) čas f()
, n
zachová jakoukoli hodnotu, kterou měl dříve (dokud ji program výslovně nezmění ).
Třetí význam je méně častý (a myslím, že méně známý):
void g(double x[static 5]) {
...
}
To znamená, že g()
lze volat pouze s ukazatelem na první z alespoň 5 double
hodnot ve formaci pole.
EDIT: Opravené vysvětlení místních statická inicializace jako (viz komentář Jesse Pollarda).
Odpověď
Statická je opakem dynamické. Co? To znamená, že paměť přidělená pro tuto proměnnou se v paměti nepohybuje. To také znamená, že při opakovaných voláních funkcí, které přistupují k této proměnné, se nevytvoří nové stínové kopie proměnné; použije se původní proměnná a jakákoli jiná funkce přistupující k této proměnné na dané adrese ji může upravit nebo přečíst. Není to samo o sobě globální proměnná; rozsah zůstává stejný jako kde a jak byl definován. Mohlo by to však být. Bylo by chybou pokusit se definovat jinou statickou proměnnou se stejným názvem ve stejném souboru nebo jinou, která je součástí aplikace.
zvažte jednoduchou funkci C add:
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;
}
počet a poslední jsou definovány staticky. To znamená, že hodnoty vložené do nich přetrvávají po více volání, která se mají přidat. count a last jsou inicializovány na nulu, ale poté se při každém volání nenulovají. Všimněte si, že rozsah count a last jsou v rámci funkce add only. Nemusí být sdíleny s jinými funkcemi nebo k nim není možné přistupovat mimo add, takže abyste se k nim dostali, musíte je vytisknout zevnitř funkce. Jiné funkce by mohly mít stejný počet i poslední statické vary a nikdy by na sebe neinteragovaly.
Nyní se podívejte na tento testovací program:
#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;
}
Tři jsou 3 sady statických proměnných count a last; všechny jsou oddělené. První jsou globálové, zde se nikdy nepoužívají. main
má svou vlastní sadu, kterou používá, protože její místní vary stínují globály. add
má vlastní sadu, která stínuje hlavní i globální se stejným názvem.
Definice statických funkcí jsou jiný druh věcí. Slovo static označuje, že funkce je viditelná pouze v souboru, který je kompilován ze zdroje, kde je funkce definována. Toto je buď zdrojový („.c“) soubor nebo záhlaví („.h) soubor v něm obsažený. To může být nutné, pokud používané objektové soubory mají více než jednu verzi funkce se stejným názvem (například add, print, error,…), takže kombinace objektových souborů („. O“) společně jako moduly nezpůsobí kolize pojmenování.