netlib.narod.ru< Назад | Оглавление | Далее >

4.6. Статические переменные

Переменные sp и val в файле stack.c, а также buf и bufp в getch.c используются только функциями этих файлов, и нет смысла открывать к ним доступ кому-либо еще. Указание static, примененное к внешней переменной или функции, ограничивает область видимости соответствующего объекта концом файла. Это способ скрыть имена. Так, переменные buf и bufp должны быть внешними, поскольку их совместно используют функции getch и ungetch, но их следует сделать невидимыми для тех, кто использует функции getch и ungetch.

На использование статической памяти указывает слово static, помещаемое перед обычным объявлением. Если рассматриваемые нами две функции и две переменные компилируются в одном файле, как в показанном ниже примере:

    static char buf[BUFSIZE];  /* буфер для ungetch */
    static int bufp = 0;       /*номер свободной позиции в buf */
    
    int getch(void) { ... }
    
    void ungetch(int c) { ... }

то никакая другая функция не будет иметь доступ ни к buf, ни к bufp, и этими именами можно свободно пользоваться в других файлах для совсем иных целей. Точно так же, помещая указание static перед объявлениями переменных sp и val, с которыми работают только функции push и pop, мы можем скрыть их от остальных функций.

Указание static чаще всего используется для переменных, но с равным успехом его можно применять и к функциям. Обычно имена функций глобальны и видимы из любого места программы. Если же функция помечена словом static, то ее имя становится невидимым вне файла, в котором она определена.

Объявление static можно использовать и для внутренних переменных. Как и автоматические переменные, внутренние статические переменные локальны в функциях, но в отличие от автоматических они не возникают только на период работы функции, а существуют постоянно. Это значит, что внутренние статические переменные обеспечивают постоянное сохранение данных внутри функции.


Упражнение 4-11


Модифицируйте функцию getop так, чтобы отпала необходимость в функции ungetch. Подсказка: используйте внутреннюю статическую переменную.



netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz