Программа на C создается путем объединения одной или нескольких единиц перевода в одну программу.
A единица перевода , по сути, является предварительно обработанным исходным файлом. Он содержит любые включенные заголовочные и исходные файлы, указанные в директивах #include
, и исключает все, что исключено #if
или аналогичными директивами.
Когда переменная в области видимости файла объявляется static
, она дает имя переменной внутренняя связь . Это означает, что имя относится к объекту, локальному для единицы перевода, в которой оно появляется. Если имя используется в другом модуле перевода, то оно не может ссылаться на объект в этом модуле перевода, оно должно ссылаться на другой объект.
[Напротив, имя с внешней связью относится к одному и тому же объекту независимо от того, в какой единице перевода используется имя.]
static int counter = 0;
Когда вы помещаете объявление, подобное этому, в файл заголовка, это означает, что каждый модуль перевода, который включает файл заголовка, имеет свой собственный уникальный объект с именем counter
, который отличается от любого объекта с именем counter
в любом другом переводе. блок. * * 1 021
В вашем случае одна единица counter
в единице перевода генерируется из CounterMain.c
, а отдельная единица в единице перевода генерируется из Count.c
. Значение в Count.c
никогда не увеличивается, но возвращается getUserNum()
, значение в CounterMain.c
увеличивается main
, но больше нигде не используется.