Ада-95. Компилятор GNAT



         

Управление порядком элаборации - часть 3


Следовательно, маркирование модулей как Pure или Preelaborate, если это возможно, является хорошим правилом.

В противном случае следует маркировать модули как Elaborate_Body.

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

Таким образом, для клиентов предусмотрены дополнительные методы управления порядком элаборации серверов от которых эти клиенты зависят:

Директива компилятора pragma Elaborate (unit)

Эта директива помещается после указания спецификатора with, и она требует, чтобы элаборация тела указанного модуля unit осуществлялась перед элаборацией модуля в котором указывается эта директива.

Эта директива используется когда в процессе элаборации текущий модуль вызывает, прямо или косвенно, какую-либо подпрограмму модуля unit.

Директива компилятора pragma Elaborate_All (unit)

Это более строгая версия директивы Elaborate.

Рассмотрим следующий пример:

Модуль A указывает в with модуль B и вызывает B.Func в процессе элаборации Модуль B указывает в with модуль C, и B.Func вызывает C.Func

Если поместить директиву Elaborate (B) в модуль A, то это гарантирует, что элаборация тела B будет выполнена перед вызовом, однако элаборация тела C перед вызовом не выполняется.

Таким образом, вызов C.Func может стать причиной возбуждения исключения Program_Error.

Результат действия директивы Elaborate_All более строгий.

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

Например, если поместить директиву Elaborate_All (B) в модуль A, то она потребует, чтобы перед элаборацией модуля A

была осуществлена элаборация не только тела модуля B, но и тела модуля C, поскольку модуль B указывает модуль C в спецификаторе with.

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




Содержание  Назад  Вперед