Строку замещения, связанную с препроцессорным идентификатором, можно заменить, приписав уже определённому идентификатору новое значение другой командой #define. Перед новым определением идентификатора рекомендуется отменить старое значение с помощью команды препроцессора
#undef идентификатор.
Например,
/* Здесь three не определено */
#define three 3
/* Здесь three определено как число 3*/
#undef three
/* Здесь three снова не определено */
#define three 33
/* Здесь three определено с другим значением, как число 33*/
Эту команду можно использовать не только для изменения значений макроса, а просто для отмены действия макроса, то есть для локализации имён макросов в тех частях программы, где они необходимы. Если в приведенном выше примере директиву
#define three 33
не написать, то макрос three будет локализован только от директивы #define three 3 до директивы #undef three.
§2. Директива #include (включение файлов).
Команда используется для включения текста из другого файла и может иметь следующие три формы записи:
#include <имя_файла>
#include “имя_файла”
#include имя
При обработке этих строк на их место вставляется содержимое файла с указанным именем или содержимое файла, определяемого макропеременной имя. Подключаемый файл может содержать следующую информацию:
заголовки (прототипы) функций. Рекомендуется таким файлам приписывать расширение .h;
определение одной или нескольких функций (тексты функций);
любая, желательно логически завершённая часть программы, не оформленная в виде функции;
объявления констант, типов (например, структур, объединений, перечислений и др.), переменных;
любые директивы препроцессора, в том числе и #define. В таком случае говорят о вложенных подключениях файлов;
Если имя_файла записано в угловых скобках, то препроцессор разыскивает файл в стандартных системных каталогах, предназначенных для хранения заголовочных файлов. Если имя_файла заключено в кавычки, то вначале препроцессор просматривает текущий каталог пользователя. И только если файл не найден там, то поиск продолжается в стандартных системных каталогах.
С помощью рассматриваемой команды можно исходный текст программы разместить не в одном файле, как мы это делали раньше, а в нескольких. Рассмотрим это на примере.
Пример. Условие задачи для вычисления определённого интеграла смотри в §3 главы 7. Для сравнения ту же задачу решим, подготовив и сохранив в одной и той же папке, например, D:\\ANA\\cpp\\includе\\Integral , следующие четыре файла с текстом программы:
1) Файл MyInclude.cpp содержит подключение стандартных заголовочных файлов, которые используются в большинстве приложений:
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
2) В файле Prototip.h размещаем прототип функции Integral:
В одном файле можно разместить прототипы нескольких функций.
3) В файле Integral.cpp будет находиться текст функции, которая реализует формулу Симпсона для вычисления определённого интеграла от произвольной функции.
float Integral (float a, float b, float n, float (*Fun)(float))
4) В файле MetodSimpsona.cpp подключаем описанные выше файлы, размещаем головную функцию main, в которой вызываем функцию Integral и текст конкретной функции, для которой будем вычислять определённый интеграл
Для выполнения программы открываем файл MetodSimpsona.cpp, обычным образом компилируем его и выполняем. Команды #include “соберут” все части программы вместе. Для вычисления определённого интеграла от другой функции достаточно внести небольшие изменения в файл MetodSimpsona.cpp, например, изменить алгоритм вычисления подинтегральной функции и (или) пределы интегрирования и (или) точность (n).
§3. Директивы условной компиляции.
Существует несколько директив, которые в зависимости от условия включают или не включают строки в текст программы для дальнейшей её компиляции. Этот процесс называется условной компиляцией и используется для подготовки различных версий одной и той же программы.