7.4 Deferred Constants
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
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.
Unless the
Import aspect (see
B.1) is True for a deferred
constant declaration, the deferred constant declaration requires a completion,
which shall be a full constant declaration (called the
full declaration
of the deferred constant).
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:
The full declaration shall occur immediately within
the private part of the same package;
The deferred and full constants shall have the
same type, or shall have statically matching anonymous access subtypes;
If the deferred constant declaration includes a
subtype_indication
S that defines a constrained subtype, then the constraint defined
by the
subtype_indication
in the full declaration shall match the constraint defined by
S
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;
If the deferred constant declaration includes the
reserved word aliased, then the full declaration shall also;
If the subtype of the deferred constant declaration
excludes null, the subtype of the full declaration shall also exclude
null.
A deferred constant declaration for which the Import
aspect is True can appear anywhere that an
object_declaration
is allowed, and has no full constant declaration.
The completion of a deferred constant declaration
shall occur before the constant is frozen (see
13.14).
Dynamic Semantics
NOTE 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
Examples of deferred
constant declarations:
Null_Key :
constant Key; --
see 7.3.1
CPU_Identifier :
constant String(1..8)
with Import => True, Convention => Assembler, Link_Name => "CPU_ID";
--
see B.1
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe