Переменные, объявленные со спецификатором static, хранятся постоянно внутри своей функции или файла. В отличие от глобальных переменных, они невидимы за пределами этой функции (файла), но сохраняют значение между вызовами [2]. Спецификатор static воздействует на локальные и глобальные переменные по-разному.
Коренное отличие статических локальных от глобальных переменных заключается в том, что первые видны только внутри блока, в котором они объявлены. Если бы их не было, пришлось бы использовать глобальные переменные, подвергая их риску непреднамеренного изменения другими участками программы. При инициализации статической локальной переменной следует учитывать, что значение присваивается ей только один раз – в начале работы всей программы, но не при каждом входе в блок программы, как обычной локальной переменной.
Спецификатор static в объявлении глобальной переменной заставляет компилятор создать глобальную переменную, видимую только в том файле, в котором она объявлена. Тогда она подвергается внутреннему связыванию.
Таким образом, имена локальных статических переменных видимы только внутри блока, в котором они объявлены; имена глобальных статических переменных – только внутри файла, в котором они объявлены [2].