- Локальность и глобальность
- Работа
Локальность и глобальность
В проекте, состоящем из нескольких файлов, изобилующих определениями переменных, функций и т.п., необходимо четко ориентироваться в том, какие описанные элементы доступны в тех или иных файлах.
Считается, что любое описание действительно только внутри блока, ограниченного фигурными скобками, где это определение реализовано. Для модуля аналогом фигурных скобок выступают начало и конец файла модуля. Любое объявление считается локальным по отношению к своему блоку.
Таким образом, все объявления, сделанные в начале модуля, «видимы» и доступны для любых функций этого модуля. Такие объявления называют глобальными для данного модуля. Итак, каждое объявление может быть локальным и глобальным одновременно, все зависит от точки отсчета.
Чтобы обеспечить видимость глобальных объявлений модуля из других модулей, необходимо вынести их в заголовочный файл, который подключить директивой #include в нужном модуле. Объявлять переменные в заголовочном файле - неверная практика, т.к. это может привести к многократному переобъявлению одних и тех же идентификаторов в различных модулях, т.е. всюду, где заголовочный файл будет подключен. Переменные и так по умолчанию считаются «видимыми» для других модулей, хотя для того, чтобы воспользоваться переменной из стороннего модуля, необходимо объявить ее внешней.
Кроме видимости, стоит упомянуть еще о действительности значений глобальных переменных. Считается, что глобальная переменная сохраняет свое значение в пределах блока своего описания. То есть, если значение глобальной переменной Cnt будет изменено функцией foo(), то это значение будет действительно и для вызванной следом функции fee().