Contents Index Search Previous Next
7.4 Deferred Constants
1
Deferred constant declarations may be used to
declare constants in the visible part of a package, but with the value
of the constant given in the private part. They may also be used to declare
constants imported from other languages (see
Annex
B).
Legality Rules
2
A
deferred constant declaration
is an
object_declaration with the
reserved word
constant but no initialization expression.
The
constant declared by a deferred constant declaration is called a
deferred
constant.
A deferred constant declaration requires
a completion, which shall be a full constant declaration (called the
full declaration of the deferred constant), or a
pragma
Import (see
Annex B).
3
A deferred constant
declaration that is completed by a full constant declaration shall occur
immediately within the visible part of a package_specification.
For this case, the following additional rules apply to the corresponding
full declaration:
4
- The full declaration shall occur immediately
within the private part of the same package;
5
- The deferred and full constants shall
have the same type;
6
- If the subtype defined by the subtype_indication
in the deferred declaration is constrained, then the subtype defined
by the subtype_indication in the
full declaration shall match it statically. On the other hand, if the
subtype of the deferred constant is unconstrained, then the full declaration
is still allowed to impose a constraint. The constant itself will be
constrained, like all constants;
7
- If the deferred constant declaration
includes the reserved word aliased, then the full declaration
shall also.
8
A deferred constant declaration that is completed
by a pragma Import need not appear
in the visible part of a package_specification,
and has no full constant declaration.
9
The completion of a deferred constant declaration
shall occur before the constant is frozen (see
7.4).
Dynamic Semantics
10
The elaboration of a deferred
constant declaration elaborates the
subtype_indication
or (only allowed in the case of an imported constant) the
array_type_definition.
11
12 The full constant declaration
for a deferred constant that is of a given private type or private extension
is not allowed before the corresponding full_type_declaration.
This is a consequence of the freezing rules for types (see 13.14).
Examples
12
Examples of
deferred constant declarations:
13
Null_Key : constant Key; -- see 7.3.1
14
CPU_Identifier : constant String(1..8);
pragma Import(Assembler, CPU_Identifier, Link_Name => "CPU_ID");
-- see B.1
Contents Index Search Previous Next Legal