Глобальные переменные и функции

Глобальные переменные и функции

С++ позволяет объявлять функции и переменные, которые не принадлежат никакому классу и к которым можно обращаться из любой другой функции. Мы видели несколько примеров глобальных функций, в частности main() — точка входа в программу. Глобальные переменные встречаются реже, потому что они плохо влияют на модульность и реентерабельность. Все же важно иметь представление о них, поскольку вам, возможно, придется с ними столкнуться в программном коде, написанном программистом, который раньше писал на С, и другими пользователями С++.

Для иллюстрации работы глобальных функций и переменных рассмотрим небольшую программу, которая печатает список из 128 псевдослучайных чисел, используя придуманный на скорую руку алгоритм. Исходный код программы находится в двух файлах .cpp.

Первый исходный файл — random.cpp:

01 int randomNumbers[128];

02 static int seed = 42;

03 static int nextRandomNumber()

04 {

05 seed = 1009 + (seed * 2011);

06 return seed;

07 }

08 void populateRandomArray()

09 {

10 for (int i = 0; i < 128; ++i)

11 randomNumbers[i] = nextRandomNumber();

12 }

В этом файле объявляются две глобальные переменные (randomNumbers и seed) и две глобальные функции (nextRandomNumber() и populateRandomArray()). В двух объявлениях используется ключевое слово static; эти объявления видимы только внутри текущей единицы компиляции (random.cpp), и говорят, что они статически связаны (static linkage). Два других объявления доступны из любой единицы компиляции программы, они обеспечивают внешнюю связь (external linkage).

Статическая компоновка идеально подходит для вспомогательных функций и внутренних переменных, которые не должны использоваться в других единицах компиляции. Она снижает риск «столкновения» идентификаторов (наличия глобальных переменных с одинаковым именем или глобальных функций с одинаковой сигнатурой в разных единицах компиляции) и не позволяет злонамеренным или другим опрометчивым пользователям получать доступ к внутренним объектам единицы компиляции.

Теперь рассмотрим второй файл main.cpp, в котором используется две глобальные переменные, объявленные в random.cpp с обеспечением внешней связи:

01 #include <iostream>

02 using namespace std;

03 extern int randomNumbers[128];

04 void populateRandomArray();

05 int main()

06 {

07 populateRandomArray();

08 for (int i = 0; i < 128; ++i)

09 cout << randomNumbers[i] << endl;

10 return 0;

11 }

Мы объявляем внешние переменные и функции до их вызова. Объявление randomNumbers внешней переменной (что делает ее видимой в текущей единице компиляции) начинается с ключевого слова extern. Если бы не было этого ключевого слова, компилятор «посчитал» бы, что он имеет дело с определением переменной, и компоновщик «пожаловался» бы на определение одной и той же переменной в двух единицах компиляции (random.cpp и main.cpp). Переменные могут объявляться любое количество раз, однако они могут иметь только одно определение. Именно благодаря определению компилятор резервирует пространство для переменной.

Функция populateRandomArray() объявляется с использованием прототипа. Указывать ключевое слово extern для функций необязательно.

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

01 #ifndef RANDOM_H

02 #define RANDOM_H

03 extern int randomNumbers[128];

04 void populateRandomArray();

05 #endif

Мы уже видели, как ключевое слово static может использоваться для объявления переменных—членов и функций—членов, которые не привязываются к конкретному экземпляру класса, и теперь мы увидели, как можно его использовать для объявления функций и переменных со статической связью. Существует еще одно применение ключевого слова static, о котором следует упомянуть. В С++ можно определить локальную переменную как статическую. Такие переменные инициализируются при первом вызове функции и сохраняют свои значения между вызовами функций. Например:

01 void nextPrime()

02 {

03 static int n = 1;

04 do {

05 ++n;

06 } while (!isPrime(n));

07 return n;

08 }

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

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

Функции и переменные. Локальные переменные

Из книги автора

Функции и переменные. Локальные переменные Объявленные ранее функции создают внутри своего тела собственные переменные. Это так называемые локальные переменные. Такие переменные доступны только внутри тела функции, в котором они объявлены. При завершении выполнения


Глобальные файловые системы

Из книги автора

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


Объединяемые глобальные индивидуальные адреса

Из книги автора

Объединяемые глобальные индивидуальные адреса Архитектура IPv6 корректировалась в процессе своего развития исходя из результатов внедрения новой версии протокола и из статистики применения старой версии. Согласно изначальному определению объединяемых глобальных


Функции и переменные. Локальные переменные

Из книги автора

Функции и переменные. Локальные переменные Объявленные ранее функции создают внутри своего тела собственные переменные. Это так называемые локальные переменные. Такие переменные доступны только внутри тела функции, в котором они объявлены. При завершении выполнения


12.8 Локальные и глобальные серверы имен доменов

Из книги автора

12.8 Локальные и глобальные серверы имен доменов В изолированной сети TCP/IP можно применять любое бесплатное программное обеспечение DNS для создания первичной базы данных трансляции имен и репликации этой базы данных в определенные точки сети. Все пользовательские запросы


7.3.3. Некоторые полезные глобальные параметры

Из книги автора

7.3.3. Некоторые полезные глобальные параметры В табл. 7.1 приведены некоторые полезные глобальные параметры программы GRUB.Таблица 7.1. Полезные глобальные параметры GRUB Параметр Описание hiddenmenu Скрывает загрузочное меню. Для его открытия нужно нажать ‹Esc›. Посла тайм-аута


10. Минимизируйте глобальные и совместно используемые данные

Из книги автора

10. Минимизируйте глобальные и совместно используемые данные РезюмеСовместное использование вызывает споры и раздоры. Избегайте совместного использования данных, в особенности глобальных данных. Совместно используемые данные усиливают связность, что приводит к


7.4.1. Передача данных через параметры и через глобальные объекты

Из книги автора

7.4.1. Передача данных через параметры и через глобальные объекты Различные функции программы могут общаться между собой с помощью двух механизмов. (Под словом “общаться” мы подразумеваем обмен данными.) В одном случае используются глобальные объекты, в другом –


8.2. Глобальные объекты и функции

Из книги автора

8.2. Глобальные объекты и функции Объявление функции в глобальной области видимости вводит глобальную функцию, а объявление переменной – глобальный объект. Глобальный объект существует на протяжении всего времени выполнения программы. Время жизни глобального


Переменные, процедуры и функции модуля ABCObjects

Из книги автора

Переменные, процедуры и функции модуля ABCObjects procedure LockDrawingObjects; Блокирует рисование графических объектов. Возможна лишь перерисовка всего экрана вместе со всеми графическими объектами на нем вызовом RedrawObjects procedure UnLockDrawingObjects; Разблокирует рисование


Лекция 18. Глобальные объекты и константы

Из книги автора

Лекция 18. Глобальные объекты и константы Локальных знаний не достаточно - компонентам ПО необходима глобальная информация: разделяемые данные, общее окно для вывода ошибок, шлюз для подключения к базе данных или сети. В классическом подходе достаточно объявить такой


Не экспортировать глобальные разрешения чтения/записи

Из книги автора

Не экспортировать глобальные разрешения чтения/записи Не делайте этого! Разрешения на доступ к файлам, устанавливающие, кто может читать и изменять файл, — очень простое понятие. Главное заключается в том, что чем больше вы предоставляете доступа к файлам вашей системы,