Таким образом, пара директив $DEFINE и $IFDEF-$ELSE-$ENDIF совместно образуют механизм условной компиляции.
Рассмотрим ещё пример. Предположим, вы пишите программу, выводящую результат в дисковый файл, однако при отладке вам хочется наблюдать результат на экране. Ну что ж, перенаправить вывод на экран совсем несложно, достаточно указать для файла пустое имя. Но при этом надо ещё организовать остановку программы после вывода на экран, чтобы успеть рассмотреть что-то. По окончании отладки надо восстановить имя дискового файла и удалить лишний оператор. Все эти хитрости легко устроить директивами условной компиляции.
{
const
FName = ''; { Предстоит вывод на экран }
FName = 'Hello.out'; { Предстоит вывод в файл на диске }
var F : text;
begin
Assign (F, FName); Rewrite(F);
Writeln(F, ’Привет, мартышка!');
Close(F);
end.
Здесь определено некое условное имя Debug (отладка), а программа содержит два варианта вывода: на экран и в файл. Разумеется, что после компиляции такой программы вывод пойдет на экран. Но переделка программы в боевую версию будет элементарна: достаточно удалить знак доллара в первой строке, и тогда директива $DEFINE превратится в безобидный комментарий.
{
Теперь, когда условное имя Debug не определено, при повторной компиляции константа FName примет значение «Hello.out», оператор Readln не откомпилируется, и мы получим вывод в дисковый файл.
А что, если надо компилировать многофайловый проект в разных вариантах: отладочном и боевом? Здесь разумно сосредоточить определения условных имен в одном месте, разместив их во включаемом файле (как мы сделали это с опциями компилятора). Возьмем, например, созданный ранее файл опций «Options.inc». Добавив в него определения условных имен, мы сможем воздействовать на компиляцию сразу всех файлов проекта.
{$A+,B-,D+,E-,F-,G+,I-,L+,N+,O-,P-,Q-,R-,S-,T+,V-,X+,Y+}
{$M 16384,0,655360}
{$define Test – действует на условия типа $IFDEF Test }
{$define Print – действует на условия типа $IFDEF Print }
Разумеется, что в модулях проекта должны быть расставлены надлежащие директивы условной компиляции.
• Включаемые (INCLUDE) файлы – это части программы, которые в момент компиляции автоматически вставляются в указанные директивами $I места. Содержимое включаемого файла должно сочетаться с окружением, в которое оно вставляется.
• Условная компиляция – это удобное средство создания различных версий одной программы. Собрав условные имена и опции во включаемом файле, можно централизовано управлять компиляцией крупного проекта.
А) Создайте отладочный вариант программы обработки классного журнала (глава 31), в котором вывод результатов будет выполняться на экран. Примените условную компиляцию.
Задачи на темы предыдущих глав
Б) Контрразведка перехватила несколько зашифрованных файлов, и подозревала, что это тексты написанных на Паскале вирусов. Позвали Шерлока