На заметку.
Препроцессор C++ — прямой потомок препроцессора С, и некоторые его средства оказались избыточными после введения в C++ новых элементов. Однако он по-прежнему является важной частью С++-среды программирования.Директива #define Директива #define
определяет имя макроса.Директива #define
используется для определения идентификатора и символьной последовательности, которая будет подставлена вместо идентификатора везде, где он встречается в исходном коде программы. Этот идентификатор называется макроименем, а процесс замены — макроподстановкой (реализацией макрорасширения). Общий формат использования этой директивы имеет следующий вид.
#define макроимя последовательность_символов
Обратите внимание на то, что здесь нет точки с запятой. Заданная последовательность_символов
завершается только символом конца строки. Между элементами макроимя (имя_макроса) и последовательность_символов может быть любое количество пробелов.Итак, после включения этой директивы каждое вхождение текстового фрагмента, определенное как макроимя
, заменяется заданным элементом последовательность_символов. Например, если вы хотите использовать слово UP в качестве значения 1 и слово DOWN в качестве значения 0, объявите такие директивы #define.
#define UP 1
#define DOWN 0
Данные директивы вынудят компилятор подставлять 1
или 0 каждый раз, когда в файле исходного кода встретится слово UP или DOWN соответственно. Например, при выполнении инструкции:
cout << UP << ' ' << DOWN << ' ' << UP + UP;
На экран будет выведено следующее:
1 0 2
После определения имени макроса его можно использовать как часть определения других макроимен. Например, следующий код определяет имена ONE
, TWO и THREE и соответствующие им значения.
#define ONE 1
#define TWO ONE+ONE
#define THREE ONE+TWO
Важно понимать, что макроподстановка
— это просто замена идентификатора соответствующей строкой. Следовательно, если вам нужно определить стандартное сообщение, используйте код, подобный этому.
#define GETFILE "Введите имя файла"
// ...
Препроцессор заменит строкой "Введите имя файла"
каждое вхождение идентификатора GETFILE. Для компилятора эта cout-инструкция
cout << GETFILE;
в действительности выглядит так.
cout << "Введите имя файла";
Никакой текстовой замены не произойдет, если идентификатор находится в строке, заключенной в кавычки. Например, при выполнении следующего кода
#define GETFILE "Введите имя файла"
// ...
cout << "GETFILE - это макроимя\n";
на экране будет отображена эта информация
GETFILE - это макроимя,
а не эта:
Введите имя файла - это макроимя
Если текстовая последовательность не помещается на строке, ее можно продолжить на следующей, поставив обратную косую черту в конце строки, как показано в этом примере.
#define LONG_STRING "Это очень длинная последовательность,\
которая используется в качестве примера."
Среди С++-программистов принято использовать для макроимен прописные буквы. Это соглашение позволяет с первого взгляда понять, что здесь используется макроподстановка. Кроме того, лучше всего поместить все директивы #define
в начало файла или включить в отдельный файл, чтобы не искать их потом по всей программе.Макроподстановки часто используются для определения "магических чисел"
программы. Например, у вас есть программа, которая определяет некоторый массив, и ряд функций, которые получают доступ к нему. Вместо "жесткого" кодирования размера массива с помощью константы лучше определить имя, которое бы представляло размер, а затем использовать это имя везде, где должен стоять размер массива. Тогда, если этот размер придется изменить, вам достаточно будет внести только одно изменение, а затем перекомпилировать программу. Рассмотрим пример.
#define MAX_SIZE 100
// ...
float balance[MAX_SIZE];
double index[MAX_SIZE];
int num_emp[MAX_SIZE];