Иллюстрированный самоучитель по Turbo Pascal

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

В меню OPTIONS/COMPILER включены опции, с помощью которых можно управлять работой компилятора. В ряде случаев бывает необходимо временно отменить действие той или иной опции при трансляции некоторого фрагмента программы. Особенно часто, например, такая необходимость возникает при обращении к диску: если программа пытается прочитать несуществующий файл или записать данные на защищенный диск, возникнет ошибка периода исполнения и программа аварийно закончит свою работу. В то же время, если отключить опцию I/O CHECKING, этого не произойдет, программа сможет проанализировать последствия обращения к диску и предпринять альтернативные действия.

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

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

Переключающая директива содержит букву, обозначающую опцию, и знак "+" или "-". Знак "+" означает установку опции в активное состояние, знак "-" – в пассивное состояние. Например, директива {$I-} означает временное отключение контроля ошибок ввода-вывода, директива {$R+} – включение контроля границ диапазона. В одной директиве можно перечислить несколько опций, например:

{ $A+,B-,D+,E+,F+,I+,L+,N+,O-,R+,S+,V+}

Следует учесть, что директивы компилятора действуют от момента своего появления в тексте до конца текущего модуля, т.е. локализуются в теле модуля, в то время как опции, установленные в самой среде, распространяются на все модули и основную программу. В случае конфликта между директивами и опциями, предпочтение отдается директивам. Таким образом, правильно расставленные директивы обеспечивают нужную компиляцию программы независимо от настройки среды. Они особенно полезны в случае, когда компиляция осуществляется автономным компилятором ТР.ЕХЕ.

Некоторые директивы компилятора могут действовать только на часть текста программы, такие директивы называются локальными; в отличие от этого глобальные директивы располагаются в самом начале текста программы (модуля) и действуют сразу на всю программу (модуль) в целом.

Ниже приводится список всех директив компилятора. В скобках дается действие директивы для знака "-". Знаком * отмечены локальные директивы.

  • {$А+} – выравнивать данные на границу слова (байта);
  • {SB+}* – вычислять логические выражения полностью (до получения результата);
  • {SD+} – разрешить (запретить) работу со встроенным отладчиком;
  • {$Е+} – включить (отключить) режим программной эмуляции сопроцессора;
  • {SF+} – использовать дальнюю (ближнюю) модель вызова;
  • {$G+}* – использовать (не использовать) полный набор команд микропроцессора Intel 80286 (микропроцессора Intel 8088);
  • {$I+}* – включить (отключить) контроль операций ввода-вывода;
  • {$L+} – включить (не включать) локальные символы в информацию для отладчика;
  • {SN+} – использовать числовой сопроцессор (реализовать операции с плавающей точкой программно);
  • {$O+} – разрешить (не разрешать) создание оверлейной структуры;
  • {$R+}* – включить (отключить) контроль границ диапазона;
  • {$S+}* – включить (отключить) контроль возможного переполнения стека;
  • {SV+}* – включить (отключить) контроль длины строк при обращении к процедуре или функции;
  • {$Х+} – использовать (не использовать) расширенный синтаксис.

К условным директивам относятся следующие локальные директивы компилятора:

  • {SDEFINE <условный символ>} – установить условный символ;
  • {SIFDEF <условный символ>} – проверить установку условного символа; если символ установлен, будет компилироваться вся следующая за директивой часть программы вплоть до директив {$ELSE} или {SENDIF}, в противном случае этот фрагмент программы будет пропущен компилятором;
  • {SIFNDEF <условный символ>} – проверить установку локального символа; обратна директиве {$IFDEF}, т.е. действует только в том случае, когда условный символ не установлен;
  • {$ELSE} – определяет начало альтернативного фрагмента программы; этот фрагмент будет компилироваться в том случае, если условный символ, проверенный предыдущей по тексту программы директивой {SIFDEF} пли {SIFNDEF}, не установлен; альтернативная часть вместе с директивой {SELSE} может опускаться;
  • {SENDIF} – ограничивает область действия директив {$IFDEF}, {IFNDEF} или {$ELSE}.
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.