Строку замещения, связанную с препроцессорным идентификатором, можно заменить, приписав уже определённому идентификатору новое значение другой командой #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:
float Integral(float, float, float, float (*Fun)(float));
В одном файле можно разместить прототипы нескольких функций.
3) В файле Integral.cpp будет находиться текст функции, которая реализует формулу Симпсона для вычисления определённого интеграла от произвольной функции.
float Integral (float a, float b, float n, float (*Fun)(float))
{ float h,s1=0,s2=0;
h=(b-a)/n;
for(int i=2;i<=(n-2);i+=2)
s1+=(*Fun)(a+i*h);
for(int i=1;i<=(n-1);i+=2)
s2+=(*Fun)(a+i*h);
return ((b-a)/(3*n)*((*Fun)(a)+2*s1+4*s2+(*Fun)(b)));
}
4) В файле MetodSimpsona.cpp подключаем описанные выше файлы, размещаем головную функцию main, в которой вызываем функцию Integral и текст конкретной функции, для которой будем вычислять определённый интеграл
#include "D:\\ANA\\cpp\\includ\\Integral\\MyInclude.cpp"
#include "D:\\ANA\\cpp\\includ\\Integral\\Prototip.h"
float Function(float);
void main()
{ float a,b,n,I; a=-1; b=1; n=100;
I=Integral(a,b,n,Function);
cout<<I;
getch(); }
#include "Integral.cpp"
float Function(float x)
{
return (x*x*sqrt(1-x*x)); }
Для выполнения программы открываем файл MetodSimpsona.cpp, обычным образом компилируем его и выполняем. Команды #include “соберут” все части программы вместе. Для вычисления определённого интеграла от другой функции достаточно внести небольшие изменения в файл MetodSimpsona.cpp, например, изменить алгоритм вычисления подинтегральной функции и (или) пределы интегрирования и (или) точность (n).
§3. Директивы условной компиляции.
Существует несколько директив, которые в зависимости от условия включают или не включают строки в текст программы для дальнейшей её компиляции. Этот процесс называется условной компиляцией и используется для подготовки различных версий одной и той же программы.