Spec-Zone.ru › Ada 2005
Справочное руководство Ada 2005

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

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

Синтаксис

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

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

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

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

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

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

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

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

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

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

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

Синтаксис

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

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

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

Примеры

Примеры директив:
pragma List(Off); -- выключить вывод
pragma Optimize(Off); -- выключить дополнительные оптимизации
pragma Inline(Set_Mask); -- сгенерировать код для Set_Mask встраиваемым
pragma Import(C, Put_Char, External_Name => "putchar"); -- импортировать функцию C putchar


Spec-Zone.ru

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