C: premenne static

Ladislav Vaiz spam na nagano.cz
Pondělí Červenec 29 22:40:50 CEST 2024


Fungovat to bude stejně, ale v druhém případě se nedá vyloučit přístup k 
proměnné z jiné funkce či z jiného modulu(zdrojáku).
L.

On 29.07.2024 22:27, Jan Waclawek wrote:
> [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.



Další informace o konferenci Hw-list