8.2. Глобальные объекты и функции
8.2. Глобальные объекты и функции
Объявление функции в глобальной области видимости вводит глобальную функцию, а объявление переменной – глобальный объект. Глобальный объект существует на протяжении всего времени выполнения программы. Время жизни глобального объекта начинается с момента запуска программы и заканчивается с ее завершением.
Для того чтобы глобальную функцию можно было вызвать или взять ее адрес, она должна иметь определение. Любой глобальный объект, используемый в программе, должен быть определен, причем только один раз. Встроенные функции могут определяться несколько раз, если только все определения совпадают. Такое требование единственности или точного совпадения получило название правила одного определения (ПОО). В этом разделе мы покажем, как следует вводить глобальные объекты и функции в программе, чтобы ПОО соблюдалось.
8.2.1. Объявления и определения
Как было сказано в главе 7, объявление функции устанавливает ее имя, а также тип возвращаемого значения и список параметров. Определение функции, помимо этой информации, задает еще и тело – набор инструкций, заключенных в фигурные скобки. Функция должна быть объявлена перед вызовом. Например:
// объявление функции calc()
// определение находится в другом файле
void calc(int);
int main()
{
int loc1 = get(); // ошибка: get() не объявлена
calc(loc1); // правильно: calc() объявлена
// ...
}
Определение объекта имеет две формы:
type_specifier object_name;
type_specifier object_name = initializer;
Вот, например, определение obj1. Здесь obj1 инициализируется значением 97:
int obj1 = 97;
Следующая инструкция задает obj2, хотя начальное значение не задано:
int obj2;
Объект, определенный в глобальной области видимости без явной инициализации, гарантированно получит нулевое значение. Таким образом, в следующих двух примерах и var1, и var2 будут равны нулю:
int var1 = 0;
int var2;
Глобальный объект можно определить в программе только один раз. Поскольку он должен быть объявлен в исходном файле перед использованием, то для программы, состоящей из нескольких файлов, необходима возможность объявить объект, не определяя его. Как это сделать?
С помощью ключевого слова extern, аналогичного объявлению функции: оно указывает, что объект определен в другом месте – в этом же исходном файле или в другом. Например:
extern int i;
Эта инструкция “обещает”, что в программе имеется определение, подобное
int i;
extern-объявление не выделяет места под объект. Оно может встретиться несколько раз в одном и том же исходном файле или в разных файлах одной программы. Однако обычно находится в общедоступном заголовочном файле, который включается в те модули, где необходимо использовать глобальный объект:
// заголовочный файл
extern int obj1;
extern int obj2;
// исходный файл
int obj1 = 97;
int obj2;
Объявление глобального объекта с указанием ключевого слова extern и с явной инициализацией считается определением. Под этот объект выделяется память, и другие определения не допускаются:
extern const double pi = 3.1416; // определение
const double pi; // ошибка: повторное определение pi
Ключевое слово extern может быть указано и при объявлении функции – для явного обозначения его подразумеваемого смысла: “определено в другом месте”. Например:
extern void putValues( int*, int );
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Глобальные файловые системы
Глобальные файловые системы Я испытываю особый интерес к файловым системам, поддерживающим устройства хранения информации подключенные к сети. Когда мы начнем разделять диски между несколькими системами в сети, скорость доставки данных станет очень важным фактором.
Объединяемые глобальные индивидуальные адреса
Объединяемые глобальные индивидуальные адреса Архитектура IPv6 корректировалась в процессе своего развития исходя из результатов внедрения новой версии протокола и из статистики применения старой версии. Согласно изначальному определению объединяемых глобальных
7.3.3. Некоторые полезные глобальные параметры
7.3.3. Некоторые полезные глобальные параметры В табл. 7.1 приведены некоторые полезные глобальные параметры программы GRUB.Таблица 7.1. Полезные глобальные параметры GRUB Параметр Описание hiddenmenu Скрывает загрузочное меню. Для его открытия нужно нажать ‹Esc›. Посла тайм-аута
Глобальные переменные и функции
Глобальные переменные и функции С++ позволяет объявлять функции и переменные, которые не принадлежат никакому классу и к которым можно обращаться из любой другой функции. Мы видели несколько примеров глобальных функций, в частности main() — точка входа в программу.
88. В качестве аргументов алгоритмов и компараторов лучше использовать функциональные объекты, а не функции
88. В качестве аргументов алгоритмов и компараторов лучше использовать функциональные объекты, а не функции РезюмеПредпочтительно передавать алгоритмам функциональные объекты, а не функции, а компараторы ассоциативных контейнеров просто должны быть функциональными
99. Не используйте недействительные объекты и небезопасные функции
99. Не используйте недействительные объекты и небезопасные функции РезюмеВы же не используете просроченные лекарства? И недействительные объекты, и "антикварные", но небезопасные функции способны навредить здоровью ваших программ.ОбсуждениеИмеется три основные
Объекты DataSet с множеством таблиц и объекты DataRelation
Объекты DataSet с множеством таблиц и объекты DataRelation До этого момента во всех примерах данной главы объекты DataSet содержали по одному объекту DataTable. Однако вся мощь несвязного уровня ADO.NET проявляется тогда, когда DataSet содержит множество объектов DataTable. В этом случае вы можете
7.4.1. Передача данных через параметры и через глобальные объекты
7.4.1. Передача данных через параметры и через глобальные объекты Различные функции программы могут общаться между собой с помощью двух механизмов. (Под словом “общаться” мы подразумеваем обмен данными.) В одном случае используются глобальные объекты, в другом –
12.3. Объекты-функции
12.3. Объекты-функции Наша функция min() дает хороший пример как возможностей, так и ограничений механизма шаблонов:template typename Typeconst Type&min( const Type *p, int size ){Type minval = p[ 0 ];for ( int ix = 1; ix size; ++ix )if ( p[ ix ] minval )minval = p[ ix ];return minval;}Достоинство этого механизма – возможность определить
12.3.1. Предопределенные объекты-функции
12.3.1. Предопределенные объекты-функции Предопределенные объекты-функции подразделяются на арифметические, логические и сравнительные. Каждый объект – это шаблон класса, параметризованный типами операндов. Для использования любого из них необходимо включить
12.3.2. Арифметические объекты-функции
12.3.2. Арифметические объекты-функции Предопределенные арифметические объекты-функции поддерживают операции сложения, вычитания, умножения, деления, взятия остатка и вычисления противоположного по знаку значения. Вызываемый оператор – это экземпляр, ассоциированный с
12.3.3. Сравнительные объекты-функции
12.3.3. Сравнительные объекты-функции Сравнительные объекты-функции поддерживают операции равенства, неравенства, больше, больше или равно, меньше, меньше или равно.equal_tostring stringEqual;sres = stringEqual( sval1, sval2 );ires = count_if( svec.begin(), svec.end(),Равенство:equal_toType* equal_tostring(), sval1 );not_equal_tocomplex
12.3.4. Логические объекты-функции
12.3.4. Логические объекты-функции Логические объекты-функции поддерживают операции "логическое И" (возвращает true, если оба операнда равны true, – применяет оператор &&, аcсоциированный с типом Type), "логическое ИЛИ" (возвращает true, если хотя бы один из операндов равен true, –
19.2.4. Объекты-исключения и виртуальные функции
19.2.4. Объекты-исключения и виртуальные функции Если сгенерированный объект-исключение имеет тип производного класса, а обрабатывается catch-обработчиком для базового, то этот обработчик не может использовать особенности производного класса. Например, к функции-члену value(),
Лекция 18. Глобальные объекты и константы
Лекция 18. Глобальные объекты и константы Локальных знаний не достаточно - компонентам ПО необходима глобальная информация: разделяемые данные, общее окно для вывода ошибок, шлюз для подключения к базе данных или сети. В классическом подходе достаточно объявить такой