Spec-Zone.ru › Ada 95
Справочник Ada 95

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

Директива компилятора — это инструкция для компилятора. Существуют предопределённые директивы, которые задают инструкции для оптимизации, управления выводом списка и т. д. Реализация может поддерживать дополнительные (определяемые реализацией) директивы.

Синтаксис

pragma ::=
pragma идентификатор [(ассоциация_аргумента_директивы {, ассоциация_аргумента_директивы})];
ассоциация_аргумента_директивы ::=
[идентификатор_аргумента_директивы =>] имя
| [идентификатор_аргумента_директивы =>] выражение
В директиве pragma любые ассоциации_аргумента_директивы без идентификатора_аргумента_директивы должны предшествовать ассоциациям с идентификатором_аргумента_директивы.
Директивы разрешены только в следующих местах программы:
  • После разделителя точки с запятой, но не внутри формальной_части или части_дискриминантов.
  • В любом месте, где правила синтаксиса допускают конструкцию, определяемую синтаксической категорией, имя которой оканчивается на "объявление", "оператор", "оператор_ввода" или "альтернатива", или одной из синтаксических категорий вариант или обработчик_исключения; но не вместо такой конструкции. Также в любом месте, где допускается единица_компиляции.
Дополнительные правила синтаксиса и ограничения на размещение существуют для определенных директив.
Имя директивы — это идентификатор, следующий за служебным словом pragma. Имя или выражение ассоциации_аргумента_директивы — это аргумент_директивы.
Идентификатор, специфичный для директивы, — это идентификатор, используемый в аргументе директивы со специальным значением для этой директивы.

Статическая семантика

Если реализация не распознаёт имя директивы, то она не влияет на семантику программы. Внутри такой директивы применяются только правила синтаксиса.

Динамическая семантика

Любая директива, появляющаяся в месте исполняемого оператора, выполняется. Если для конкретной директивы не указано иного, это выполнение заключается в вычислении каждого вычисляемого аргумента директивы в произвольном порядке.

Требования к реализации

Реализация должна выдать сообщение об ошибке для нераспознанного имени директивы.

Разрешения для реализации

Реализация может предоставлять директивы, определённые реализацией; имя такой директивы должно отличаться от имен предопределённых директив языка.
Реализация может игнорировать нераспознанную директиву, даже если она нарушает некоторые правила синтаксиса, если обнаружение синтаксической ошибки слишком сложно.

Рекомендации для реализации

Обычно, директивы, определённые реализацией, не должны влиять на семантику корректной программы; то есть, если убрать директивы, определённые реализацией, из работающей программы, программа по-прежнему должна быть корректной и иметь ту же семантику.
Обычно реализация не должна определять директивы, которые могут сделать некорректную программу корректной, за исключением следующих случаев:
  • Директива, используемая для завершения объявления, например, директива Import;
  • Директива, используемая для настройки среды путём добавления, удаления или замены элементов библиотеки.

Синтаксис

Форматы директив List, Page и Optimize:
pragma List(идентификатор);
pragma Page;
pragma Optimize(идентификатор);
Другие директивы определены в этом Международном стандарте и приведены в Приложении L.

Статическая семантика

Директива List принимает один из идентификаторов On или Off в качестве единственного аргумента. Эта директива допустима в любом месте, где допустима директива pragma. Она определяет, должно ли продолжение вывода списка во время компиляции продолжаться или приостанавливаться до тех пор, пока не будет задана директива List с противоположным аргументом в той же компиляции. Сама директива всегда отображается, если компилятор производит вывод списка.
Директива Page допустима в любом месте, где допустима директива pragma. Она указывает, что текст программы, следующий за директивой, должен начинаться на новой странице (если компилятор в данный момент производит вывод списка).
Директива Optimize принимает один из идентификаторов Time, Space или Off в качестве единственного аргумента. Эта директива допустима в любом месте, где допустима директива pragma, и действует до конца ближайшей области объявления или, для директивы в месте единицы компиляции, до конца компиляции. Она даёт рекомендации реализации о том, является ли время или место основным критерием оптимизации, или что необязательные оптимизации следует выключить. То, как эта рекомендация используется, определяется реализацией.

Примеры

Примеры директив:
pragma List(Off); -- выключение генерации вывода списка
pragma Optimize(Off); -- выключение необязательных оптимизаций
pragma Inline(Set_Mask); -- сгенерировать код для Set_Mask по inline
pragma Suppress(Range_Check, On => Index); -- выключить проверку диапазона для Index





Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API