Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Паскаль / tp3 / tp3 / 21

.doc
Скачиваний:
18
Добавлен:
10.12.2013
Размер:
95.23 Кб
Скачать

Глава 21. Директивы компилятора

Некоторые из возможностей компилятора Турбо Паскаля реализуются с помощью директив компилятора. Директива компилятора представляет собой комментарий со специальным синтаксисом. Турбо Паскаль допускает директивы компилятора везде, где допускаются комментарии.

Директива компилятора начинается со знака $, стоящего первым после открывающего граничного знака комментария. Непосредственно после знака $ следует имя (одна или несколько букв), которое определяет конкретные директивы. Имеются три типа директив:

- Директивы-переключатели. Эти директивы включают конкретные возможности компилятора или выключают их с помощью указания знака плюса "+" или минуса "-" сразу после имени директивы.

- Директивы с параметрами. Эти директивы задают параметры, оказывающие влияние на компиляцию, такие, например, как имена файлов и размеры памяти.

- Условные директивы. Эти директивы используются для управления условной компиляцией частей исходного текста, основанной на определении пользователем условных идентификаторов.

Все директивы, за исключением директив-переключателей, должны иметь крайней мере один пробел между именем директивы и параметром.

Ниже приводятся некоторые примеры директив компилятора:

{$B+}

{$R- Turn off range-checking}

{$I TYPES.INC}

{$U C:\UNITS\MEM}

{$M 65520,8192,655360}

{$DEFINE Debug}

{$IFDEF Debug}

{$ENDIF}

Директивы компилятора вы можете разместить непосредственно в исходном коде программы. Можно также изменить используемые по умолчанию директивы с помощью компилятора, использующего командную строку (TPWC.EXE) или с помощью компилятора, работающего в интегрированной интерактивной среде (TPW.EXE). Все директивы компилятора можно задавать с помощью меню выбора параметров компилятора (Options│Compiler). Все вносимые вами в меню изменения будут иметь силу при последующих компиляциях. При использовании командного компилятора директивы компилятора можно либо задавать в командной строке (например, TPWC /$R+ MYPROG), либо поместить их в файл конфигурации (более детальное описание дается в Главе 8 "Руководства пользователя"). Директивы компилятора, которые содержатся в исходном коде, всегда отменяют принятые по умолчанию значения директив. Это справедливо как для компилятора, работающего в режиме командной строки, так и для интерактивного компилятора.

Если вы работаете в интегрированной среде, используя альтернативный набор команд редактора, и хотите быстро просмотреть, какие действуют директивы компилятора, нажмите Ctrl+O O. Турбо Паскаль поместит текущие установки в вершину окна редактирования.

Директивы-переключатели

Директивы-переключатели могут быть глобальными или локальными. Глобальные директивы оказывают влияние на всю компиляцию, тогда как локальные директивы оказывают влияние только на ту часть компиляции, которая происходит, начиная с появления данной директивы до следующего ее обнаружения.

Глобальные директивы должны указываться перед разделом описания данной программы или данного программного модуля, подлежащих компиляции, то есть перед первым использованием ключевых слов uses, label, const, type, procedure, function или begin. Локальные директивы могут задаваться в любом месте программы или программного модуля.

Несколько директив-переключателей можно сгруппировать в одном комментарии директив компилятора с разделением их запятыми, например:

{$B+,R,S-}

В этом случае пробелы между директивами могут не указываться.

Выравнивание данных

Синтаксис: {$A+} или {$A-}

По умолчанию: {$A+}

Тип: Глобальный.

Эквивалент меню: Option│Compiler│Word Align Data (Параметры│Компилятор│Выравнивание данных на границу слова).

Данная директива позволяет переключаться между выравниванием переменных и типизованных констант на границу слова и на границу байта. Для процессора 8088 выравнивание на границу слова игнорируется. Однако для всех процессоров 80х86 выравнивание на границу слова означает более быстрое выполнение, поскольку адресация ко всем элементам, имеющим размер в слово, или четным адресам происходит за один цикл обращения к памяти вместо двух.

В состоянии {$A+} все переменные и типизованные константы, превышающие по размеру один байт, выравниваются на границу машинного слова (адреса с четными значениями). В случае необходимости между переменными для достижения выравнивания на границу слова включаются дополнительные неиспользуемые байты. Директива {$A+} не влияет ни на переменные размером в байт, ни на поля структур или элементы массивoв. Поле записи будет выравниваться на границу слова только в том случае, если общий размер всех следующих перед ним полей будет иметь четное значение. Аналогично, для любого элемента массива выравнивание на границу слова будет иметь место только когда размер элементов имеет четное значение.

В состоянии {$A-} никаких действий по выравниванию не предпринимается. Переменные и типизованные константы независимо от их размера помещаются в этом случае просто по следующему доступному адресу.

Независимо от директивы $A+ в разделе описаний каждое описание var и const всегда начинается на границе слова. Аналогично, компилятор компилятор всегда старается поддерживать указатель стека (SP) настроенным на границу слова, для чего в случае необходимости для стека процедуры выделяется дополнительный неиспользуемый байт.

Булевские вычисления

Синтаксис: {$B+} или {$B-}

Значение по умолчанию: {$B+}

Тип: Локальный.

Эквивалент меню: Options│Compiler│Complete Boolean Evaluation (Параметры│Компилятор│Полные булевские вычисления).

Эта директива осуществляет два различных вида генерации кода для булевских операций and и or.

В состоянии {$B+} компилятор генерирует код для полного вычисления булевского выражения. Это значит, что каждый операнд булевского выражения, состоящий из операторов and и or, будет вычислен, даже если результат всего выражения заранее известен.

В состоянии {$B-} компилятор генерирует код для вычисления булевского выражения по короткой схеме, то есть вычисление прекратится сразу, как станет очевидным результат вычисления всего этого выражения.

Более подробно смотрите информацию в Главе 6 в разделе "Булевские операции" .

Информация для отладки

Синтаксис: {$D+} или {$D-}

По умолчанию: {$D+}

Тип: Глобальный.

Эквивалент меню: Options│Compiler│Debug Information (Параметры│Компилятор│Информация для отладки).

Данная директива задает или отменяет генерацию информации для отладке. Отладочная информация состоит из таблицы номеров строк для каждой процедуры, устанавливающей соответствие адресов объектных кодов с номерами строк исходного текста.

Для программных модулей отладочная информация записывается в файл .TPU вместе с объектным кодом. Отладочная информация приводит к увеличению размера файлов .TPU и требует дополнительного пространства при компиляции использующей данный модуль программы, но на размер и скорость работы выполняемой программы влияния не оказывает.

Директива $D не будет действовать, пока не установите Debug Information (Информация для отладки) в параметре EXE (Option│Linker) в интегрированной среде или не зададите параметр /V в командной строке при использовании компилятора TPWC.EXE.

Если параметр Debug Information установлен для данной программы или модуля, для выполнения этого модуля по шагам или установки в нем точки останова вы можете использовать Турбо отладчик для Windows.

Если вы компилируете модуль в состоянии {$D+}, параметр Map File (Options│Linker) создает для данного модуля полную информацию о номерах строк.

Переключатель отладочной информации обычно $D используется вместе с переключателем локальных символов $L, который позволяет включить или выключить генерацию отладочной информации по локальным символам.

Дальний тип вызова

Синтаксис: {$F+} или {$F-}

По умолчанию: {$F-}

Тип: Локальный.

Эквивалент меню: Option│Compiler│Force Far Calls (Параметры│Компилятор│Использование дальнего типа вызова).

Данная директива управляет выбором типа вызова последовательно компилируемых процедур и функций. Процедуры и функции, скомпилированные в состоянии {$F+}, всегда используют дальний тип обращений. При указании директивы {$F-} Турбо Паскаль автоматически выбирает соответствующий тип обращений: дальний, если процедура или функция описывается в разделе интерфейс программной единицы, и ближний в противном случае.

Дальний и ближний тип вызова описываются полностью в Главе 18 "Вопросы управления".

Генерация кода для процессора 80286

Синтаксис: {$G+} или {$G-}

По умолчанию: {$G-}

Тип: Локальный.

Эквивалент меню: Option│Compiler│286 Instructions (Параметры│Компилятор│Инструкции процессора 80286).

Директива $G разрешает или запрещает генерацию кода для процессора 80286. В состоянии {$G-} генерируются только инструкции процессора 8086, и программы, сгенерированные в этом состоянии могут выполняться на любом процессоре серии 80х86. В состоянии {$G+} компилятор использует дополнительные инструкции процессора 80286, которые улучшают генерацию кода, но программы, скомпилированные в этом состоянии, не смогут работать на процессорах 8086 или 8088. Эти дополнительные инструкции включают в себя инструкции ENTER, LEAVE, PUSH с непосредственным операндом, расширенную инструкцию IMUL и расширенные инструкции SHL и SHR.

Проверка ошибок ввода-вывода

Синтаксис: {$I+} или {$I-}

По умолчанию: {$I+}

Тип: Локальный.

Эквивалент меню: Option│Compiler│I/O Checking (Параметры│Компилятор│Проверка ввода-вывода).

Данная директива задает или отменяет автоматическую генерацию кода, проверяющего результат обращения к процедуре вводавывода. Процедуры ввода-вывода описываются в Главе 19 ("Вопросы ввода и вывода"). Если процедура ввода-вывода возвращает ненулевой результат ввода-вывода при включенном переключателе (+), то программа завершает работу, выводя на экран сообщения об ошибке во время выполнения. Если переключатель выключен (-), то результат операции ввода-вывода нужно проверять с помощью функции OIResult.

Информация о локальных идентификаторах

Синтаксис: {$L+} или {$L-}

По умолчанию: {$L+}

Тип: Глобальный.

Эквивалент меню: Options│Compiler│Local Symbols (Параметры│Компилятор│Локальные идентификаторы).

Данная директива приводит в действие или отменяет генерацию информации о локальных идентификаторах. Информация о локальных идентификаторах состоит из имен и типов всех локальных переменных и констант данного модуля, то есть из идентификаторов в секции реализации модуля и идентификаторов, содержащихся в процедурах и функциях этого модуля.

Когда для данного модуля задана генерация информации о локальных идентификаторах встроенный отладчик Турбо Паскаля позволяет вам проверять и модифицировать локальные переменные модуля. Кроме того, с помощью меню Window│Calls Stack window (Окно│Окно стека вызова) можно проверять обращения к процедурам и функциям модуля.

Для модулей информация о локальных идентификаторах записывается в файле .TPU наряду с объектным кодом модуля. Эта информация увеличивает размер файлов (требуется дополнительное пространство). Однако на размер и скорость работы выполняемой программы это влияния не оказывает.

Директива $L не будет действовать, пока не установите Debug Info (Информация для отладки) в параметре EXE (Option│Linker) в интегрированной среде или не зададите параметр /V в командной строке Турбо Паскаля при использовании компилятора TPWC.EXE.

Если параметр генерации информации о локальных идентификаторах установлен для данной программы или модуля, для проверки и моджификации значений локальных переменных этого модуля вы можете использовать Турбо отладчик для Windows.

Параметры Map File (Options│Linker) и Debug Info (Options│Linker) создают для данного модуля информации о локальных идентификаторах только в том случае, если этот модуль компилируется в состоянии {$L+}.

Переключатель, задающий включение информации о локальных идентификаторах $L, обычно используется вместе с директивой включения в файл отладочной информации, которая позволяет включить или выключить генерацию таблицы номеров строк для отладки. Заметим, что в том случае, если переключатель отладочной информации выключен ({$D-}), директива $L будет игнорироваться.

Проверка границ

Синтаксис: {$R+} или {$R-}

По умолчанию: {$R-}

Тип: Локальный.

Эквивалент меню: Options│Compiler│Range-Checking (Параметры│Компилятор│Проверка диапазона)

Данный переключатель приводит в действие и отменяет генерацию кода с проверкой границ. При указании директивы {$R+} все выражения с индексированными строками и массивы проверяются на предмет нахождения их внутри указанных границ, а все операторы присваивания значений скалярным величинам и переменным поддиапазонов проверяются на нахождение в заданных границах. Если обнаруживается нарушение диапазона, программа завершает свою работу, выводя сообщения об ошибке этапа выполнения. Приведенная в действие проверка границ замедляет работу программы и увеличивает ее размер. Используйте эту директиву при отладке, а затем, после получения отлаженной программы, удалите ее.

Если директива $R включена, то все обращения к виртуальным методам проверяются на состояние инициализации для экземпляра объекта, выполняющего вызов. Если экземпляр объекта, выполняющий вызов, не инициализирован своим конструктором, то происходит ошибка этапа выполнения по нарушению диапазона.

Разрешение проверки границ и вызовов виртуальных методов замедляет выполнение ваших программ и несколько увеличивает их размер, поэтому директиву {$R+} следует использовать только для отладки.

Проверка переполнения стека

Синтаксис: {$S+} или {$S-}

По умолчанию: {$S+}

Тип: Локальный.

Эквивалент меню: Options│Compiler│Stack Checking (Параметры│Компилятор│Проверка стека).

Данная директива приводит в действие или отменяет генерацию кода с проверкой переполнения стека. При указании директивы {$S+} компилятор генерирует в начале каждой процедуры или функции код, который проверяет, достаточное ли место в стеке выделено для локальных переменных. Если в стеке места недостаточно, то обращение к процедуре или функции, скомпилированной с указанием директивы {$S+}, приводит к завершению работы программы, которая при этом выводит сообщение об ошибке времени выполнения. При указании директивы {$S-} такое обращение наиболее вероятно приведет к фатальной ошибке системы.

Проверка параметров-переменных строкового типа

Систаксис: {$V+} или {$V-}

По умолчанию: {$V+}

Тип: Локальный.

Эквивалент меню: (Options│Compiler│Strict Var String (Параметры│Компилятор│Проверка строк-переменных).

Проверка параметров-переменных строкового типа управляет проверкой типа при передаче строк в качестве параметров-переменных. В состоянии {$V+} выполняется строгая проверка типа, при которой требуется, чтобы формальный и фактический параметр имели идентичные строковые типы (string). В состоянии {$V-} в качестве фактического параметра допускается использовать любую переменную строкового типа, даже если ее описанная длина не совпадает с длиной соответствующего формального параметра.

Кадры стека Windows

Синтаксис: {$W+} или {$W-}

По умолчанию: {$W+}

Тип: Локальный.

Эквивалент меню: Options│Compiler│Windows Stack Frames (Параметры │Компилятор│Кадры стека Windows).

Директива $W управляет генерацией специфического для Windows кода входа и выхода для процедур и функций с дальним типом вызова (far). В состоянии {$W+} для процедур и функций far генерируется специальная запись кода и выхода, благодаря чему подсистема управления памятью реального режима Windows может корректно идентифицировать дальние кадры стека при настройкке на цепочки вызова после перемещения сегмента кода или данных. В состоянии {$W-} генерируется дополнительная запись кода или выхода. Если программа работает в стандартном режиме Windows или только в улучшенном режиме Windows 386, директиву $W можно запретить (состояние {$W-}).

Расширенный синтаксис

Синтаксис: {$X+} или {$X-}

По умолчанию: {$X-}

Тип: Глобальный.

Эквивалент меню: Options│Compiler│Extended Syntax (Параметры│Компилятор│Расширенный синтаксис).

Директива компилятора $X разрешает или запрещает расширенный синтаксис Турбо Паскаля.

- Операторы функции. В режиме {$X+} вызовы функций можно использовать, как операторы, то есть результат функции может отбрасываться. В общем случае вычисления, выполняемые функцией, представляются через результат, поэтому в отбрасывании результата смысла мало. Однако в определенных случаях функция на основе своих параметров может выполнять много операций. В некоторых из таких случаев результат функции не имеет смысла. В таких ситуациях расширения, допускаемые по директиве {$X+}, позволяют интерпретировать функцию, как процедуру.

Примечание: Директива {$X+} не применяется к встроенным функциям (то есть функциям, определенным в модуле System).

- Строки, завершающиеся нулем. Директива компилятора {$X+}, активизируя специальные правила, которые применяются к встроенному типу PChar и символьным массивам с нулевой базой, разрешает поддержку Турбо Паскалем строк с завершающим нулем. Подробнее об этих строках рассказывается в Главе 13 "Модул Strings".

Директивы с параметрами

Данные директивы позволяют вам задавать параметры, влияющие на выполнение программы.

Атрибут сегмента кода

Синтаксис: {$C атрибут атрибут}

Тип: Глобальный.

По умолчанию: {$C MOVEABLE PRELOAD PERMANENT}

Директива $C используется для управления атрибутами сегмента кода. Каждый сегмент кода в прикладной программе или библиотеке имеет набор атрибутов, которые определяют поведение сегмента кода при загрузке в память. Например, вы можете задать, что сегмент кода является перемещаемым (MOVEABLE). Это означает, что Windows может при необходимости перемещать сегмент кода в памяти. Либо вы можете указать, что сегмент кода фиксированный. Это означает, что расположение сегмента кода в памяти изменяться не может.

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

──────────────────────────────────────────────────────

MoveAble Windows может изменять расположение

сегмента кода в памяти.

Fixed Windows не может изменять

расположение сегмента кода в памяти.

──────────────────────────────────────────────────────

Preload Сегмент кода загружается при

выполнении программы.

DemandLoad Сегмент кода загружается только при

необходимости.

──────────────────────────────────────────────────────

Permanent После того, как Windows загружает

сегмент, он остается в памяти.

Discardable Когда сегмент кода больше не нужен,

он может выгружаться.

──────────────────────────────────────────────────────

Первый атрибут в каждой группе назначается по умолчанию. С помощью директивы $C вы можете задать несколько атрибутов сегментов кода. Если в данной директиве заданы оба атрибута группы, то действовать будет только последний из них. Например, директива:

{$C Fixed Moveable Discardable}

приведет к созданию перемещаемого (Moveable) сегмента кода, и когда он больше не требуется, сегмент будет выбрасываться (Discardable).

Описание

Синтаксис: {$D тектс}

Тип: Глобальный.

Директива $D включает в файл EXE или DLL заданный вами текст. Обычно это примечание об авторских правах и номере версии, но вы можете задать любой текст по своему усмотрению, например:

{$D My Masterprice version 12.5 (C) Fly By Nite Software, 1991}

Включение файла

Синтаксис: {$I имя_файла}

Тип: Локальный.

Данная директива сообщает компилятору о необходимости включить в компиляцию названный файл. Фактически файл вставляется в скомпилированный текст непосредственно за директивой {$I имя_файла}. Расширением по умолчанию для параметра "имя_файла" является .PAS. Если параметр "имя_файла" не указывает каталога, то в дополнение к поиску файлов в текущем каталоге Турбо Паскаль осуществляет поиск его в каталогах, указанных в меню Options│Directories│Include Directories, или в каталогах, указанных в параметре /I командной строки компилятора Паскаля TPWC.

Это значит, что для включаемых файлов допускается вложенность на глубину до 15 уровней.

Имеется одно ограничение на использование включаемых файлов: включаемый файл не может указываться в середине раздела операторов. Это означает, что все операторы между операторными скобками begin и end раздела операторов должны постоянно находиться в одном и том же исходном файле.

Компоновка объектного файла

Синтаксис: {$L имя_файла }

Тип: Локальный.

Данная директива (где "имя_файла" - имя объектного файла) предписывает компилятору скомпоновать указанный файл с компилируемой программой или программным модулем. Директива $L используется для компоновки кода, написанного на языке Ассемблера для подпрограмм, описанных как внешние (external). Указанный файл должен быть перемещаемым объектным файлом в формате Intel (файл .OBJ). Расширением по умолчанию для параметра "имя_файла" является .OBJ. Если в параметре "имя_файла" каталог не задан, то в дополнение к поиску файла в текущем каталоге Турбо Паскаль просматривает каталоги, указанные в меню Options│Directories│Include Directories (Параметры│Каталоги│Каталоги включаемых файлов) или в каталогах, указанных в параметре /O командной строки компилятора ТРWС.

Более подробно о компоновке с языком Ассемблера рассказывается в Главе 23 "Компоновка с кодом Ассемблера".

Размеры выделяемой памяти

Синтаксис: {$M размер_стека, размер_динамической_области}

По умолчанию: {$M 8192,8192}

Тип: Глобальный.

Эквивалент меню: Options│Memory Sizes (Параметры│Размеры памяти).

Данная директива указывает параметры распределения памяти программы. Параметр "размер_стека" должен быть целым числом в диапазоне от 1024 до 65520, которое указывает размер области стека в сегменте данных прикладной программы. Для библитеки параметр размера стека игнорируется (библиотека использует стек прикладной программы, которая ее вызывает). Параметр "размер_динамической_области" должен быть числом в диапазоне от 0 до 655360 и задает размер локальной динамически распределяемой области памяти в сегменте данных.

Сегмент стека и динамически распределяемая область памяти обсуждаются в Главе 4 "Переменные" и в Главе 16 "Использование памяти".

Директива $M при использовании ее в программном модуле (unit) не оказывает влияния на компиляцию программы.

Арифметический сопроцессор

Синтаксис: {$N+} или {$N-}

По умолчанию: {$N-}

Тип: Глобальный.

Эквивалент меню: Options│Compiler│80x87 code (Параметры│Компилятор│Код сопроцессора 80х87).

Данная директива позволяет переключаться между двумя различными режимами поддерживаемыми Турбо Паскалем модулями генерации кода с плавающей точкой. В состоянии {$N-} генерируется код для выполнения всех вычислений вещественными числами программным путем, с помощью вызова подпрограмм библиотеки исполняющей системы. В состоянии {$N+} генерируется код для выполнения операций с вещественнми числами с помощью арифметического сопроцессора.

Файл ресурсов

Синтаксис: {$R имя_файла}

Тип: Локальный.

ДЖиректива $R задает имя файла ресурсов, который должен включаться в прикладную программу или библиотеку. Указанный файл должен представлять собой файл ресурсов Windows. По умолчанию он имеет расширение .RES.

Когда директива {$R имя_файла} используется в модуле, указанное имя файла просто записывается в получаемый файл .TPU. Никаких проверок для обеспечения корректности файла с указанным именем и его существования не выполняется.

При компоновке прикладной программы или библиотеки (после компиляции программы или исходного файла библиотеки), обрабатываются файлы ресурсов, заданные во всех используемых модулях, программе или в библиотеке, и каждый ресурс в каждом файле ресурсов копируется в создаваемый файл .EXE или .DLL. На этапе обработки ресурсов копмоновщих Турбо Паскаля ищет файлы ресурсов в текущем каталоге и в каталогах, заданных в окне ввода O│D│Resource Directories (Параметры│Каталоги│Каталоги файлов ресурсов) или в каталогах, заданных в директиве /R компилятора TPWC.

Условная компиляция

Директивы условной компиляции языка Турбо Паскаль позволяют с помощью условных идентификаторов получать различный код из одного и того же исходного текста.

Имеются две основные конструкции условной компиляции, которые весьма похожи на оператор Паскаля if. Первой конструкцией является конструкция:

{$IFxxx} ... {$ENDIF}

которая приводит к компиляции исходного текста между {$IFxxx} и {$ENDIF} только в случае, если условие, указанное в {$IFxxx}, удовлетворяется (имеет значение True). Если же это условие имеет значение False, то исходный текст между этими двумя директивами игнорируется.

Второй конструкцией условной компиляции является конструкция:

{$IFxxx} ... {$ELSE} ... {$ENDIF}

которая приводит к компиляции либо исходного текста между {$IFxxx} и {$ELSE}, или исходного текста между {$ELSE} и {$ ENDIF} в зависимости от условия, указанного с помощью {$IFxxx}.

Приведем некоторые примеры конструкций условной компиляции.

{$IFDEF Debug}

Writeln('X=',X);

{$ENDIF}

{$IFDEF CPU87}

{$N+}

type

real = double;

{$ELSE}

{$N-}

type

single = real;

double = real;

extended = real;

comp = real;

{$ENDIF}

Конструкции условной компиляции могут вкладываться одна в другую (допускается до 16 уровней вложенности). Для каждого {$IFxxx} соответствующая директива {$ENDIF} должна находиться в том же исходном файле. Это значит, что в каждом исходном файле должно быть равное количество директив {$IFxxx} и {$ENDIF}.

Условные идентификаторы

Условная компиляция основывается на вычислении условных идентификаторов. Условные идентификаторы определяются и разопределяются (становятся неопределенными) с помощью директив:

{$DEFINE name}

{$UNDEF name}

Вы можете также воспользоваться переключателем /D в компиляторе TPWC и элементом ввода Conditional Defines (Условные определения) меню Options│Compiler (Параметры│Компилятор) интегрированной среды.

Условные идентификаторы лучше всего сравнить с булевскими переменными: они могут принимать значения True (определено) или False (неопределено). Директива {$DEFINE} устанавливает данный символ в значение True, а директива {$ UNDEF} устанавливает его в значение False.

Соседние файлы в папке tp3