Когда переменная или функция объявляются в области видимости файла (не внутри какой-либо другой пары { }
фигурных скобок), и они объявляются static
, они являются локальными для единицы перевода они находятся в.
Единица перевода - это формальный термин в C, который немного отличается от файла.Единицей перевода является один файл c и все файлы h, которые он включает.
Итак, в вашем случае переменная static
является локальной для единицы перевода, состоящей из test.h
и main.c
.Вы сможете получить к нему доступ в main.c, но не в foo.c.
Это означает, что если у вас есть другой файл .c, включающий test.h
, вы получите два экземпляра одной и той же переменной,с тем же именем.Это в свою очередь может привести к всевозможным сумасшедшим ошибкам.
Это одна из многих причин, по которой мы никогда не определяем переменные внутри заголовочных файлов.
(Чтобы избежать разработки программы для спагетти, мы не должны также объявлять переменные в заголовках, если они не квалифицированы как const
).