Язык С

       

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


Статические переменные представляют собой третий класс памяти, в дополнении к автоматическим переменным и EXTERN, с которыми мы уже встречались. Статические переменные могут быть либо внутренними, либо внешними. Внутренние статические переменные точно так же, как и автоматические, являются локальными для некоторой фун- кции, но, в отличие от автоматических, они остаются сущест- вовать, а не появляются и исчезают вместе с обращением к этой функции. это означает, что внутренние статические пере- менные обеспечивают постоянное, недоступное извне хранение внутри функции. Символьные строки, появляющиеся внутри функ- ции, как, например, аргументы PRINTF , являются внутренними статическими. Внешние статические переменные определены в остальной части того исходного файла, в котором они описаны, но не в каком-либо другом файле. Таким образом, они дают способ скрывать имена, подобные BUF и BUFP в комбинации GETCH-UNGETCH, которые в силу их совместного использования должны быть внешними, но все же не доступными для пользова- телей GETCH и UNGETCH , чтобы исключалась возможность конф- ликта. Если эти две функции и две переменные объеденить в одном файле следующим образом

STATIC CHAR BUF[BUFSIZE]; /* BUFFER FOR UNGETCH */ STATIC INT BUFP=0; /*NEXT FREE POSITION IN BUF */

GETCH() {...}

UNGETCH() {...}

то никакая другая функция не будет в состоянии обратиться к BUF и BUFP; фактически, они не будут вступать в конфликт с такими же именами из других файлов той же самой программы. Статическая память, как внутренняя, так и внешняя, спе- цифицируется словом STATIC , стоящим перед обычным описани- ем. Переменная является внешней, если она описана вне какой бы то ни было функции, и внутренней, если она описана внутри некоторой функции.

Нормально функции являются внешними объектами; их имена известны глобально. возможно, однако, объявить функцию как STATIC ; тогда ее имя становится неизвестным вне файла, в котором оно описано. В языке "C" "STATIC" отражает не только постоянство, но и степень того, что можно назвать "приватностью". Внутренние статические объекты определены только внутри одной функции; внешние статические объекты /переменные или функции/ опреде- лены только внутри того исходного файла, где они появляются, и их имена не вступают в конфликт с такими же именами пере- менных и функций из других файлов. Внешние статические переменные и функции предоставляют способ организовывать данные и работающие с ними внутренние процедуры таким образом, что другие процедуры и данные не могут прийти с ними в конфликт даже по недоразумению. Напри- мер, функции GETCH и UNGETCH образуют "модуль" для ввода и возвращения символов; BUF и BUFP должны быть статическими, чтобы они не были доступны извне. Точно так же функции PUSH, POP и CLEAR формируют модуль обработки стека; VAR и SP тоже должны быть внешними статическими.



    Содержание раздела