QT 4: программирование GUI на С++
Шрифт:
Макросы были очень популярны в прежние дни, когда еще не были введены typedef, перечисления, константы, встраиваемые функции и шаблоны. В наши дни они играют важную роль в предотвращении многократных включений заголовочных файлов.
• Макрос можно отменить в любом месте с помощью директивы #undef:
Эту возможность необходимо использовать, если требуется переопределить макрос, поскольку препроцессор не позволяет определять один и тот же макрос дважды. Эту директиву полезно
• Отдельные фрагменты программного кода можно обрабатывать или пропускать при помощи директив #if, #elif, #else и #endif в зависимости от конкретных числовых значений макросов. Например:
В приведенном выше примере компилятором будет обрабатываться только второе объявление, которое вводит синоним для short. Изменяя определение макроса OPTIMIZATION, мы получим другие программы. Если макрос не определен, он будет иметь значение 0.
Другим оператором условной компиляции является проверка макроса на предмет его определения. Это можно сделать следующим образом, используя оператор defined:
• Ради удобства препроцессор воспринимает #ifdef X и #ifndef X как синонимы #if defined(X) и #if !defined(X). Для пpeдoтвpaщeния мнoгoкpaтныx включeний заголовочного файла мы окружаем его содержимое следующими директивами:
При первом включении заголовочного файла символ MYHEADERFILE_H оказывается неопределенным, поэтому компилятор обрабатывает программный код, заключенный между директивами #ifndef и #endif. При повторном и последующих включениях заголовочного файла символ MYHEADERFILE_H оказывается определенным, поэтому весь блок #ifndef … #endif пропускается.
• Директива #errоr генерирует на этапе
В отличие от большинства других конструкций С++, в которых недопустимы пробельные символы, препроцессорные директивы должны быть единственными в строке и не должны содержать точку с запятой. Слишком длинные директивы можно разбивать на несколько строк, заканчивая каждую строку, кроме последней, обратной наклонной чертой.
Стандартная библиотека С++
В данном разделе мы кратко рассмотрим стандартную библиотеку С++. На рис. Б.З приводится список базовых заголовочных файлов С++:
• <bitset> — шаблонный класс для представления последовательностей битов фиксированной длины,
• <complex> — шаблонный класс для представления комплексных чисел,
• <exception> — типы и функции, относящиеся к обработке исключений,
• <limits> — шаблонный класс, определяющий свойства числовых типов,
• <locale> — классы и функции, относящиеся к локализации,
• <new> — функции, управляющие динамическим распределением памяти,
• <stdexcept> — заранее определенные типы исключений для вывода сообщений об ошибках,
• <string> — шаблонный строковый контейнер и свойства символов,
• <typeinfo> — класс, предоставляющий основную метаинформацию о типах,
• <valarray> — шаблонные классы для представления массивов значений.
Заголовочные файлы <exception>, <limits>, <new> и <typeinfo> поддерживают возможности языка С++; например, <limits> позволяет проверять возможности поддержки компилятором целочисленной арифметики и арифметики чисел с плавающей точкой, a <typeinfo> предлагает основные средства анализа информации о типах. Другие заголовочные файлы предоставляют часто используемые классы, в том числе класс строки и тип комплексных чисел. Функциональность, предлагаемая заголовочными файлами <bitset>, <locale>, <string> и <typeinfo>, свободно перекрывается в Qt классами QBitArray, QLocale, QString и QMetaObject.