C: premenne static

Jan Waclawek konfera na efton.sk
Pondělí Červenec 29 23:15:42 CEST 2024


Netrap sa, rozumies tomu dobre. Takze len zopakujem co si povedal, inymi
slovami: 

A. "bezna" lokalna premenna (t.j. premenna deklarovane v bloku, co
viacmenej znamena vo vnutri tela funkcie) je *viditelna* (t.j. pouzitelna)
len vo vnutri funkcie (po jej prvej deklaracii/definicii), a jej
*zivotnost* je obmedzena - vznika vzdy pri vstupe do daneho bloku a zanika
vzdy pri odchode z daneho bloku (t.j. jej hodnota sa nezachova a pri
opakovanom vstupe do daneho bloku je jej hodnota bud nahodna alebo rovna
inicializatoru, ak je v definicii aj inicializovana).

B. "bezna" globalna premenna (t.j. premenna deklarovana mimo bloku) je
*viditelna* v celom subore v ktorom je definovana (znova az po jej prvej
deklaracii/definicii), a jej *zivotnost* je "trvala" pocas celej doby
vykonavania programu

Teraz pride klucove slovo static:
C. lokalna premenna oznacena ako static je *viditelna* stale len vo vnutri
bloku, ale jej *zivotnost* je rovnaka ako u beznej globalnej premennej,
t.j. pocas celej doby vykonavania programu; inicializuje sa tiez rovnako
ako globalna premenna, t.j. ak ma explicitny inicializator, tak sa pred
spustenim programu inicializuje na tu hodnotu; ak ho nema, tak na nulu.

---
Lenze C je ekologicky jazyk, ktory neplytva klucovymi slovami a poctivo ich
recykluje na rozne ucely, aj ked je to matuce (rovnako aj rozne symboly;
C++ je este zelensi a prevzal tuto uzasnu koncepciu a rozvinul ju do
nevidanych rozmerov).

A tak static sa pouziva aj inde, a ako bolo naznacene, na uplne ine a
matuce ucely.

Menovite, "bezna" globalna premenna z "B" nielenze je viditelna v ramci
suboru, ona je viditelna aj z inych zdrojovych suborov (t.j. je
linkovatelna). Ale
D. ak ku globalnej premennej pripojime specifikator static, tak sa obmedzi
jej viditelnost skutocne len na dany subor (a nie je prilinkovatelna z
ineho suboru).

Pre milovnikov pravnictiny, v C99, znamejsia a dolezitejsia uloha "static"
z C. je 6.2.4#3:
An object whose identifier is declared with external or internal linkage,
or with the storage-class specifier static has static storage duration. 
Its lifetime is the entire execution of the program and its stored value is
initialized only once, prior to program startup.
 
ta menej znama z D. je 6.2.2#3:
If the declaration of a file scope identifier for an object or a function
contains the storage-class specifier static, the identifier has internal
linkage.
(na nu sucasne plati aj ten static storage duration z C., ale kedze
globalne premenne maju defaultne static storage duration, navonok sa to
neprejavuje).

Samozrejme som sa pozrel aj do Dereka Jonesa, ci nema k tomu nejaku
klasicku suchu poznamku, a nesklamal som sa:
The keyword static is overworked in the C language. It is used to indicate
a variety of different properties.

---
V C99 ma static este aj tretiu ulohu, ktora je mimoriadne zriedkava a je
len pre fajnsmekrov, takze o nej tu ani nebudem pisat (pre tych
fajnsmekrov, 6.7.5.3#7 ... uzite si to! :-) )

wek



----- Original Message ---------------
[preposielam]

Ahojte,
chcel by som sa spytat tych znalejsich standardu C99 aky je rozdiel medzi
premnnymi v nasledujucich dvoch fragmentoch kodu. Ide o kompilator XC8 a
MCC-konfigurator. Pokial zapnem generovanie kodu a automaticky callback
rutiny pri TMR0, tak to vygeneruje nasledovny fragment kodu:

#define CALLBACK_COUNTER 10

void __interrupt TMR0_OverflowISR(void) {

static volatile unsigned char ISR_Counter = 0;

   if(++ISR_Counter >= CALLBACK_COUNTER) {
       CallBackRoutine();
       ISR_Counter = 0;
    }
}

Ja by som to napisal takto:

#define CALLBACK_COUNTER 10

volatile unsigned char ISR_Counter = 0;

void __interrupt TMR0_OverflowISR(void) {

   if(++ISR_Counter >= CALLBACK_COUNTER) {
       CallBackRoutine();
       ISR_Counter = 0;
    }
}

Viete mi prosim vysvetlit niekto aky je rozdiel v C99 v premennych raz
globalnych bez static a raz lokalnych s privlastkom static? Ako myslim, ze
som pochopil, ze ta static lokalna zostane "ziva" aj po opusteni rutiny
prerusenia, ale nie je mi to velmi jasne. Preto sa pytam. On totiz ten XC8
v2.46 je uz asi moc C99 kompatibilny a ja nie som az taky dobry programator
C, aby som jednotlive nuansy ovladal dokonale.

Velmi pekne dakujem za odpovede a vysvetlenie.

A.

_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list



Další informace o konferenci Hw-list