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