next up previous contents
Elõre: Típusdefiniáló (typedef) azonosítók Fel: Módosító jelzõk Vissza: A const módosító jelzõ

A volatile módosító jelzõ

Az ANSI C a volatile módosító jelzõt ugyan definiálja, de nem adja meg a komkrét, implementáció-független értelmezését. Egy volatile objektummal kapcsolatban csak azt a kivánalmat fogalmazza meg a C szabvány, hogy egy ilyen tárolási egységre vonatkozólag az adott C fordító semmiféle optimalizálást ne hajtson végre.

A BORLAND C++ esetében ez azt jelenti, hogy a a volatile jelzõ majdnem az ellentéte a const-nak. Azt jelzi, hogy a tárolási egység elvileg bármelyik pillanatban módosulhat egy, az adott programtól független folyamat (például megszakítási rutin, DMA stb.) által. A fordítóprogram a volatile jelzõ hatására az adott változót nem fogja regiszterben tárolni, és az optimalizálás során sem fogja a többszörös, vagy látszólag felesleges értékadásokat kiiktatni. A volatile módosító jelzõ használatára tekintsük a következõ példát:

            volatile int ticks;

            void interrupt timer(void)
            {
               ticks++;
            } /* end timer() */

            void wait(int interval)
            {
               ticks = 0;
               while (ticks < interval)
                ;
            } /* end wait() */
A timer függvény megszakítási rutinként aktivizálódik valamely periodikus hardveresemény hatására. A wait függvény a megszakítási rutin által módosított ticks értékét ciklikusan lekérdezi. Nagyfokú optimalizálás esetén a fordítóprogram generálhat olyan kódot, amely a ciklusban a ticks értékét csak egyszer veszi tekintetbe (mert az a ciklusban explicit módon nem változik meg), ezáltal végtelen ciklust eredményezve. Ennek elkerülésére szolgál a ticks definíciójában a volatile jelzõ: a ciklus minden egyes futása alkalmával ki kell értékelni ticks tartalmát, hiszen azt egy megszakítási rutin módosítja.