Объявление переменной на внутреннем уровне с классом памяти static в языке Си
В качестве примера рассмотрим объявление переменной i на внутреннем уровне с классом памяти static.
исходный файл file1.c
main()
{
}
fun1()
{static int i = 0;
исходный файл file2.c
fun2()
{static int i = 0;
}
fun3()
{static int i = 0;
}
В этом примере объявлены три различные переменные с классом памяти static, которые имеют одинаковые имена i. Все эти переменные обладают глобальным временем жизни, но видимы только в том
блоке (функции), в котором они объявлены. Данные
переменные можно применять для подсчета числа обращений к каждой из трех функций.
Переменные класса памяти static способны быть
инициализированными константным выражением.
Когда явной инициализации нет, то данной переменной присваивается нулевое значение. В случае инициализации константным адресным выражением можно применять адреса любых внешних объектов, кроме адресов объектов, для которых класс
памяти auto, так как их адрес не является константой и
меняется при любом входе в блок. Инициализация
осуществляется один раз при первом входе в блок.
Переменная, которая объявлена локально с классом
памяти extern, служит ссылкой на переменную с таким
же именем, определенную глобально в каком-либо из
исходных файлов программы. Цель подобного объявления заключается в том, чтобы сделать определение переменной глобального уровня видимым внутри блока.