Справочник по Ada 95
10.1.3 Подразделения единиц компиляции
Подразделения подобны дочерним единицам, с этими (важными) различиями: подразделения поддерживают отдельную компиляцию только тел (не объявлений); родительская единица содержит body_stub для указания существования и местоположения каждого из своих подразделений; объявления, появляющиеся в теле родительской единицы, могут быть видимыми внутри подразделений.
Синтаксис
body_stub ::= subprogram_body_stub | package_body_stub | task_body_stub | protected_body_stub
subprogram_body_stub ::= subprogram_specification is separate;
package_body_stub ::= package body defining_identifier is separate;
task_body_stub ::= task body defining_identifier is separate;
protected_body_stub ::= protected body defining_identifier is separate;
subunit ::= separate (parent_unit_name) proper_body
Правила легальности
Тело родителя подраздела — это тело программной единицы, обозначаемой его parent_unit_name. Термин подразделение используется для обозначения subunit, а также proper_body subunit.
Тело родителя подраздела должно присутствовать в текущей среде и должно содержать соответствующий body_stub с тем же defining_identifier, что и подразделение.
package_body_stub должен быть завершением package_declaration или generic_package_declaration; task_body_stub должен быть завершением task_declaration; protected_body_stub должен быть завершением protected_declaration.
В отличие от этого, subprogram_body_stub не обязательно должен быть завершением предыдущего объявления, в этом случае _stub объявляет подпрограмму. Если _stub является завершением, то это должно быть завершение subprogram_declaration или generic_subprogram_declaration. Профиль subprogram_body_stub, завершающего объявление, должен полностью соответствовать профилю объявления.
Подразделение, соответствующее body_stub, должно быть того же типа (package_, subprogram_, task_ или protected_) что и body_stub. Профиль подраздела subprogram_body должен полностью соответствовать профилю соответствующего body_stub.
body_stub должен появляться непосредственно внутри declarative_part тела единицы компиляции. Это правило не применяется внутри экземпляра обобщённой единицы.
Идентификаторы defining_identifier всех body_stubs, которые появляются непосредственно внутри конкретной declarative_part, должны быть различными.
Правила после компиляции
Для каждого body_stub должно быть подразделение, содержащее соответствующее proper_body.
ПРИМЕЧАНИЯ
4 Правила в 10.1.4, «Процесс компиляции» говорят, что body_stub эквивалентен соответствующему proper_body. Это подразумевает:
- Видимость внутри подраздела — это видимость, которая была бы получена в месте соответствующего body_stub (в теле родительской единицы), если бы context_clause подраздела была добавлена к context_clause родительского тела.
- Эффект выполнения body_stub заключается в выполнении подраздела.
Примеры
Пакет Parent сначала записывается без подразделений:
package Parent is
procedure Inner;
end Parent;
procedure Inner;
end Parent;
with Ada.Text_IO;
package body Parent is
Variable : String := "Привет, там.";
procedure Inner is
begin
Ada.Text_IO.Put_Line(Variable);
end Inner;
end Parent;
package body Parent is
Variable : String := "Привет, там.";
procedure Inner is
begin
Ada.Text_IO.Put_Line(Variable);
end Inner;
end Parent;
Тело процедуры Inner может быть преобразовано в подразделение, переписав тело пакета следующим образом (с оставшимся объявлением Parent):
package body Parent is
Variable : String := "Привет, там.";
procedure Inner is separate;
end Parent;
Variable : String := "Привет, там.";
procedure Inner is separate;
end Parent;
with Ada.Text_IO;
separate(Parent)
procedure Inner is
begin
Ada.Text_IO.Put_Line(Variable);
end Inner;
separate(Parent)
procedure Inner is
begin
Ada.Text_IO.Put_Line(Variable);
end Inner;