Вся и вся цель static
состоит в том, чтобы объявить, что переменная закрыта для исходного файла, который объявлен в . Таким образом, он делает именно свою работу по предотвращению соединения извне.
Имейте в виду, что существует четыре варианта определения переменной области файла:
int blah = 0;
- бла определяется в этом файле и доступна из других файлов. Определения в других файлах являются дубликатами и приведут к ошибкам.
extern int blah;
- blah должен быть определен в другом месте и на него есть ссылки из этого файла.
int blah;
- это моральный эквивалент Фортрана COMMON
. Вы можете иметь любое количество таких файлов в файлах, и все они разрешаются компоновщиком в один общий int
. (*)
static int blah;
(опционально с инициализатором) - это статично. Это полностью личное для этого файла. Он не виден внешним файлам в других файлах, и вы можете иметь много разных файлов, которые все объявляют static TYPE blah;
, и все они отличаются .
Для пуристов в аудитории: 'file' = блок компиляции .
Обратите внимание, что статические внутренние функции (не в области видимости файла) еще более ограничены: если две функции объявляют static int bleh = 0;
даже в одном и том же файле, они не связаны.
(*): для тех из вас, кто не знаком: в обычном шаблоне одна единица компиляции должна определять глобальную переменную, а другие могут ссылаться на нее. Он «живет» в этой сборочной единице. В случае (3) выше ни один файл (или все файлы) не определяет его. Если в двух файлах указано int blah = 0;
, компоновщик будет жаловаться на несколько определений. Если два файла говорят int blah;
, компоновщик весело создает один глобальный int
и заставляет весь код обращаться к нему.