Читать «Полный справочник по С++» онлайн - страница 22

Герберт Шилдт

Спецификатор extern играет важную роль в программах, состоящих из нескольких файлов. Программу, написанную на языке C/C++, можно разделить на несколько файлов, скомпилировать их отдельно, а затем отредактировать связи между ними. Для этого необходимо иметь возможность сообщить всем файлам о глобальных переменных, существующих в программе. Лучше всего объявить все глобальные переменные в одном файле, а в других объявить их с помощью спецификатора extern, как показано ниже. Это усилит машинонезависимость программы.

Первый файлВторой файл
int х, у;extern int x, y;
char ch;extern char ch.-
int main(void)void func22(void)
{{
/* ...*/x = у / 10;
))
void fund (void)void func23(void)
{{
x = 123;У = 10;
}}

Список глобальных переменных копируется из первого файла во второй, а затем добавляется спецификатор extern. Он сообшает компилятору, что имена и типы переменных, следующих далее, объявлены в другом месте. Иными словами, спецификатор extern сообщает компилятору типы и имена глобальных переменных, не выделяя для них память еще раз. Все ссылки на внешние переменные распознаются в процессе редактирования связей.

На практике объявления внешних переменных обычно хранятся в заголовочных файлах, которые просто включаются в исходный код. Это и легче, и надежнее, чем дублировать все объявления внешних переменных в каждом файле вручную.

В языке C++ спецификатор extern имеет еще одно применение, которое описано в части П.

Спецификатор extern можно также применять к объявлениям функций, но это излишне.

На заметку

Статические переменные

Статические переменные, в отличие от глобальных, неизвестны вне своей функции или файла, и сохраняют свои значения между вызовами. Это очень полезно при создании обобщенных функций и библиотек функций, которые могут использоваться другими программистами. Статические переменные отличаются как от локальных, так и от глобальных переменных.

Локальные статические переменные

Если локальная переменная объявлена с помощью спецификатора static, компилятор выделит для нее постоянное место хранения, как и для глобальной переменной. Принципиальное отличие локальной статической переменной от глобальной состоит в том, что первая остается доступной лишь внутри своего блока. Проше говоря, локальная статическая переменная — это локальная переменная, сохраняющая свои значения между вызовами функции.

Такие переменные очень полезны при создании изолированных функций, поскольку между вызовами их можно использовать в других частях программы. Если бы статических переменных не было, пришлось бы применять глобальные переменные, порождая неизбежные побочные эффекты. Примером удачного применения статических переменных является генератор чисел, который порождает новое число, используя предыдущее значение. Для хранения этого числа можно было бы использовать глобальную переменную, однако при каждом новом вызове ее пришлось бы объявлять заново, постоянно проверяя, не конфликтует ли она с другими глобальными переменными. Применение статической переменной легко решает эту проблему.