Читать «QT 4: программирование GUI на С++» онлайн - страница 332

Жасмин Бланшет

#else

typedef long long MyInt;

#endif

В приведенном выше примере компилятором будет обрабатываться только второе объявление, которое вводит синоним для short. Изменяя определение макроса OPTIMIZATION, мы получим другие программы. Если макрос не определен, он будет иметь значение 0.

Другим оператором условной компиляции является проверка макроса на предмет его определения. Это можно сделать следующим образом, используя оператор defined():

#define OPTIM_FOR_MEMORY

#if defined(OPTIM_FOR_SPEED)

typedef int MyInt;

#elif defined(OPTIM_FOR_MEMORY)

typedef short MyInt;

#else

typedef long long MyInt;

#endif

• Ради удобства препроцессор воспринимает #ifdef X и #ifndef X как синонимы #if defined(X) и #if !defined(X). Для пpeдoтвpaщeния мнoгoкpaтныx включeний заголовочного файла мы окружаем его содержимое следующими директивами:

#ifndef MYHEADERFILE_H

#define MYHEADERFILE_H

#endif

При первом включении заголовочного файла символ MYHEADERFILE_H оказывается неопределенным, поэтому компилятор обрабатывает программный код, заключенный между директивами #ifndef и #endif. При повторном и последующих включениях заголовочного файла символ MYHEADERFILE_H оказывается определенным, поэтому весь блок #ifndef … #endif пропускается.

• Директива #errоr генерирует на этапе компиляции определенное пользователем сообщение об ошибке. Эта директива часто используется в комбинации с директивами условной компиляции для вывода сообщения о возникновении недопустимого условия. Например:

class UniChar

{

public:

#if BYTE_ORDER == BIG_ENDIAN

uchar row;

uchar cell;

#elif BYTE_ORDER == LITTLE_ENDIAN

uchar cell;

uchar row;

#else

#error "BYTE_ORDER must be BIG_ENDIAN or LITTLE_ENDIAN"

#endif

};

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

Стандартная библиотека С++

В данном разделе мы кратко рассмотрим стандартную библиотеку С++. На рис. Б.З приводится список базовых заголовочных файлов С++:

• <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.